{
  "openapi": "3.1.0",
  "info": {
    "title": "API cục bộ",
    "description": "API MoreLogin cung cấp giao diện RESTful toàn diện và thân thiện với nhà phát triển, cho phép quản lý lập trình hồ sơ trình duyệt, điện thoại đám mây và các tài nguyên liên quan. API cục bộ MoreLogin chạy trên máy tính của bạn và có thể truy cập tại: 127.0.0.1:40000",
    "version": "2026-09-05"
  },
  "servers": [
    {
      "url": "http://127.0.0.1:40000",
      "description": "Local API"
    }
  ],
  "tags": [
    {
      "name": "Profiles",
      "description": "Các API liên quan đến Profiles."
    },
    {
      "name": "Runtime",
      "description": "Các API liên quan đến Runtime."
    },
    {
      "name": "Cloud Runtime",
      "description": "Các API liên quan đến Cloud Runtime."
    },
    {
      "name": "Fingerprint & Device Config",
      "description": "Các API liên quan đến Fingerprint & Device Config."
    },
    {
      "name": "Cache & Window",
      "description": "Các API liên quan đến Cache & Window."
    },
    {
      "name": "Proxy Management",
      "description": "Các API liên quan đến Proxy Management."
    },
    {
      "name": "Group Management",
      "description": "Các API liên quan đến Group Management."
    },
    {
      "name": "Tag Management",
      "description": "Các API liên quan đến Tag Management."
    }
  ],
  "x-tagGroups": [
    {
      "name": "",
      "tags": [
        "Profiles",
        "Runtime",
        "Cloud Runtime",
        "Fingerprint & Device Config",
        "Cache & Window"
      ]
    }
  ],
  "paths": {
    "/api/env/setTags/batch": {
      "post": {
        "operationId": "setBrowserProfileTagsLocal",
        "security": [],
        "summary": "Đặt thẻ hồ sơ trình duyệt hàng loạt",
        "description": "Ghi đè thẻ của các tài nguyên đã chọn. Cần quyền quản lý thẻ và quyền truy cập đối tượng. Tên được so khớp chính xác trong nhóm: tạo thẻ chưa có, tái sử dụng thẻ hiện có và cập nhật màu. Thay đổi màu cũng ảnh hưởng đến tài nguyên khác dùng cùng thẻ. Không được trùng tên trong một yêu cầu. Mảng `tags` rỗng chỉ xóa liên kết, giữ lại định nghĩa thẻ và nhóm. Xử lý đồng bộ, `data` là null. Sau khi hết thời gian chờ, truy vấn đối tượng và `/api/envtag/all` trước khi thử lại; không có khóa lũy đẳng.\n\nCác mã lỗi nghiệp vụ đã ghi nhận: `15003`, `15004`, `19039`, `19173`, `19193`. Xem [Error Codes](../Getting%20Started/error-codes.md) để biết ý nghĩa từng mã. Mọi thao tác cũng có thể trả về các mã dùng chung.",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "tags"
                ],
                "properties": {
                  "envIds": {
                    "type": "array",
                    "description": "ID hồ sơ. Cung cấp `envIds` hoặc `uniqueIds` không rỗng; `envIds` không rỗng được ưu tiên. Áp dụng quy tắc chọn hàng loạt và kiểm tra quyền hiện có.",
                    "items": {
                      "type": "string",
                      "pattern": "^\\d+$",
                      "example": "1993244721490239488"
                    }
                  },
                  "uniqueIds": {
                    "type": "array",
                    "description": "Số thứ tự hồ sơ, dùng khi envIds rỗng hoặc bị bỏ qua.",
                    "items": {
                      "type": "integer",
                      "example": 1
                    }
                  },
                  "tags": {
                    "type": "array",
                    "description": "Thẻ thay thế toàn bộ liên kết hiện tại. Mảng rỗng xóa liên kết mà không xóa định nghĩa thẻ.",
                    "items": {
                      "type": "object",
                      "required": [
                        "tagName"
                      ],
                      "properties": {
                        "tagName": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 100,
                          "description": "Tên thẻ, so khớp chính xác trong nhóm. Từ chối tên trùng trong cùng yêu cầu.",
                          "pattern": "\\S"
                        },
                        "tagColor": {
                          "default": "red",
                          "description": "Màu thẻ. Bỏ qua hoặc để trống sẽ dùng red; chỉ chấp nhận tên màu, không dùng mã thập lục phân.",
                          "anyOf": [
                            {
                              "enum": [
                                "red",
                                "blue",
                                "green",
                                "yellow",
                                "purple",
                                null
                              ]
                            },
                            {
                              "type": "string",
                              "pattern": "^\\s*$"
                            }
                          ]
                        }
                      }
                    }
                  }
                },
                "anyOf": [
                  {
                    "required": [
                      "envIds"
                    ],
                    "properties": {
                      "envIds": {
                        "type": "array",
                        "description": "ID hồ sơ. Cung cấp `envIds` hoặc `uniqueIds` không rỗng; `envIds` không rỗng được ưu tiên. Áp dụng quy tắc chọn hàng loạt và kiểm tra quyền hiện có.",
                        "items": {
                          "type": "string",
                          "pattern": "^\\d+$",
                          "example": "1993244721490239488"
                        },
                        "minItems": 1
                      }
                    }
                  },
                  {
                    "required": [
                      "uniqueIds"
                    ],
                    "properties": {
                      "uniqueIds": {
                        "type": "array",
                        "description": "Số thứ tự hồ sơ, dùng khi envIds rỗng hoặc bị bỏ qua.",
                        "items": {
                          "type": "integer",
                          "example": 1
                        },
                        "minItems": 1
                      }
                    }
                  }
                ]
              },
              "examples": {
                "replace": {
                  "value": {
                    "envIds": [
                      "1993244721490239488"
                    ],
                    "tags": [
                      {
                        "tagName": "Sales",
                        "tagColor": "blue"
                      }
                    ]
                  }
                },
                "clear": {
                  "value": {
                    "envIds": [
                      "1993244721490239488"
                    ],
                    "tags": []
                  }
                },
                "bySerialNumber": {
                  "value": {
                    "uniqueIds": [
                      1
                    ],
                    "tags": [
                      {
                        "tagName": "Sales",
                        "tagColor": "blue"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. Liên kết thẻ đã được cập nhật đồng bộ; data là null.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "example": 0
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    },
                    "data": {
                      "type": "null"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": null
                }
              }
            }
          }
        }
      }
    },
    "/api/env/start": {
      "post": {
        "summary": "Khởi tạo hồ sơ trình duyệt",
        "operationId": "startBrowserProfileUsingPOST",
        "deprecated": false,
        "description": "Dùng để khởi tạo hồ sơ; bạn phải chỉ định ID hồ sơ. Sau khi khởi động thành công, bạn có thể truy cập giao diện gỡ lỗi hồ sơ để thực thi tự động hóa Selenium và Puppeteer. Đối với Selenium, hãy sử dụng\nWebDriver phù hợp với phiên bản kernel tương ứng. Đường dẫn WebDriver\ncó thể được lấy từ phản hồi sau khi khởi động hồ sơ. Yêu cầu\nphiên bản máy khách MoreLogin 2.15.0 trở lên.\n\nCác mã lỗi nghiệp vụ đã ghi nhận: `19099`, `19143`. Xem [Error Codes](../Getting%20Started/error-codes.md) để biết ý nghĩa từng mã. Mọi thao tác cũng có thể trả về các mã dùng chung.",
        "tags": [
          "Runtime"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "envId": {
                    "type": "string",
                    "description": "Mã định danh môi trường. Phải cung cấp ít nhất một trong hai giá trị `envId` hoặc `uniqueId`.\n\nNếu cung cấp cả hai, `envId` sẽ được ưu tiên.\n",
                    "example": "1993244721490239488"
                  },
                  "uniqueId": {
                    "type": "integer",
                    "description": "Số sê-ri môi trường (mã định danh dạng số nguyên nhỏ). Phải cung cấp ít nhất một trong hai giá trị `envId` hoặc `uniqueId`.\n\nNếu cung cấp cả hai, `envId` sẽ được ưu tiên.\n",
                    "example": 1
                  },
                  "encryptKey": {
                    "type": "string",
                    "description": "Khóa mã hóa. Chỉ cần thiết nếu tính năng mã hóa đầu cuối được bật cho môi trường.\n",
                    "example": "xxx"
                  },
                  "isHeadless": {
                    "type": "boolean",
                    "description": "Liệu có khởi động ở chế độ không giao diện người dùng hay không. Mặc định là `false` nếu bỏ qua tham số này.\n\nLưu ý: Yêu cầu phiên bản máy khách v2.36.0 trở lên.\n",
                    "default": false,
                    "example": false
                  },
                  "cdpEvasion": {
                    "type": "boolean",
                    "description": "Kích hoạt tính năng né tránh dấu vân tay CDP để giảm nguy cơ bị phát hiện.\n\nChỉ áp dụng cho môi trường PC.\n\nMặc định: `false`.\n\nLưu ý: Yêu cầu phiên bản máy khách v2.36.0 trở lên.\n",
                    "default": false,
                    "example": false
                  },
                  "closeCheckIPPage": {
                    "type": "boolean",
                    "description": "Có bỏ qua việc mở trang kiểm tra hay không.\ntrue: kiểm tra proxy trước khi thực thi\nfalse: kiểm tra proxy sau khi thực thi\nLưu ý: Yêu cầu client phiên bản v2.56.0 hoặc mới hơn.\n",
                    "default": false,
                    "example": false
                  },
                  "checkIPErrorHandle": {
                    "type": "integer",
                    "description": "Hành động thực hiện nếu kiểm tra proxy thất bại\nKiểu số: 1 hoặc 2\n1: Không khởi động môi trường nếu kiểm tra proxy thất bại\n2: Vẫn khởi động môi trường dù kiểm tra proxy thất bại\nNếu đã truyền giá trị cho closeCheckIPPage thì tham số này bị bỏ qua; mặc định: 1\nLưu ý: Yêu cầu client phiên bản v2.56.0 hoặc mới hơn.\n",
                    "default": 1,
                    "example": 1
                  }
                }
              },
              "example": {
                "envId": "1993244721490239488",
                "isHeadless": false,
                "cdpEvasion": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là một đối tượng với các trường `envId`, `debugPort`, `type`, `version` và `webdriver`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "envId": {
                          "type": "string",
                          "description": "hồ sơ"
                        },
                        "debugPort": {
                          "type": "string"
                        },
                        "type": {
                          "type": "string"
                        },
                        "version": {
                          "type": "integer"
                        },
                        "webdriver": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "envId",
                        "debugPort",
                        "type",
                        "version",
                        "webdriver"
                      ]
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Định danh yêu cầu duy nhất; hãy cung cấp khi liên hệ hỗ trợ"
                    }
                  },
                  "required": [
                    "data"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "envId": "1673823102599682",
                    "debugPort": "9222",
                    "type": "string",
                    "version": 1,
                    "webdriver": "string"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/close": {
      "post": {
        "operationId": "closeBrowserProfileLocal",
        "summary": "Dừng hồ sơ trình duyệt",
        "deprecated": false,
        "description": "Đóng một profile trình duyệt đang chạy.\n\n- **Nơi thực thi**: client desktop của MoreLogin xử lý hoàn toàn việc này trên máy của bạn. **Không có phần hiện thực ở phía server**, nên không tồn tại điều kiện tiên quyết nào về tài khoản, nhóm hay trạng thái ngoài việc client đang mở profile, và không có gì được ghi lại trên cloud.\n- **Tác động**: chỉ giới hạn trong các tiến trình và cửa sổ trình duyệt cục bộ. Dữ liệu profile, dấu vân tay và cache trên cloud đều không bị ảnh hưởng.\n- **Hoàn tất**: đồng bộ — client trả lời ngay khi đã thực hiện.\n- **Khả dụng**: chỉ Local API. Open API không có endpoint tương đương, vì nó không có trình duyệt cục bộ nào để tác động. Hãy dùng các endpoint runtime trên cloud thay thế.\n- **Lưu ý**: vì client là bên nắm giữ chức năng này, hình dạng phản hồi phụ thuộc vào phiên bản client đã cài chứ không phải vào một hợp đồng dịch vụ.",
        "tags": [
          "Runtime"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "envId": {
                    "description": "Mã định danh môi trường hoặc số sê-ri — ít nhất phải cung cấp một trong hai; nếu có cả hai, mã định danh môi trường sẽ được ưu tiên.",
                    "type": "string"
                  },
                  "uniqueId": {
                    "description": "Số sê-ri môi trường — ít nhất một trong hai giá trị 'envId' hoặc 'uniqueId' phải được cung cấp; nếu có cả hai, 'envId' sẽ được ưu tiên.",
                    "type": "integer"
                  }
                }
              },
              "example": {
                "envId": "1869649942658850816",
                "uniqueId": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là một đối tượng với các trường `envId` và `debugPort`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "envId": {
                          "type": "string"
                        },
                        "debugPort": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "envId",
                        "debugPort"
                      ]
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Định danh yêu cầu duy nhất; hãy cung cấp khi liên hệ hỗ trợ"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "envId": "1673823102599682",
                    "debugPort": "9222"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/create/quick": {
      "post": {
        "operationId": "createBrowserProfileQuickLocal",
        "summary": "Tạo hồ sơ trình duyệt nhanh",
        "deprecated": false,
        "description": "Tạo từ 1 đến 200 profile trình duyệt dùng chung một cấu hình.\n- **Điều kiện tiên quyết**: gói của nhóm phải còn đủ số profile, và hạn mức tạo trong ngày chưa được dùng hết. `isEncrypt=1` yêu cầu nhóm đã cấu hình khóa mã hóa. Firefox chỉ khả dụng trên Windows và macOS. `groupId` phải đã tồn tại, nhưng nếu truyền `groupName` thay cho nó thì nhóm sẽ được tạo tự động.\n- **Tác động**: chèn các profile, tiêu tốn dung lượng của gói, và tăng bộ đếm tạo trong ngày. Truyền thông tin kết nối proxy cũng có thể tạo thêm một bản ghi proxy.\n- **Hoàn tất**: đồng bộ. `data` chứa ID của các profile mới theo thứ tự tạo.\n- **Thử lại**: không idempotent, và không có khóa idempotency. Hãy xác nhận bằng `/env/page` thay vì thử lại.\n- **Local API**: các kernel ứng viên được lọc theo phiên bản client desktop đang chạy, và các lệnh gọi đồng thời từ cùng một nhóm được xếp tuần tự bằng khóa ở cấp nhóm.\n\nCác mã lỗi nghiệp vụ đã ghi nhận: `19002`, `19063`, `19064`, `19104`, `19106`, `19107`, `19108`, `19111`, `19112`, `14023`. Xem [Error Codes](../Getting%20Started/error-codes.md) để biết ý nghĩa từng mã. Mọi thao tác cũng có thể trả về các mã dùng chung.",
        "tags": [
          "Profiles"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "browserTypeId": {
                    "description": "1:Chrome, 2:Firefox",
                    "type": "integer",
                    "example": 1
                  },
                  "groupId": {
                    "description": "ID nhóm môi trường; mặc định: không được nhóm (0)",
                    "type": "string",
                    "example": "0"
                  },
                  "groupName": {
                    "description": "Tên nhóm (tối đa 50 ký tự). Nếu được cung cấp, hệ thống sẽ kiểm tra groupId trước: nếu tìm thấy nhóm hợp lệ thì sử dụng nhóm đó; nếu không, tìm kiếm theo groupName. Nếu nhóm có tên đó tồn tại thì tham chiếu nhóm đó; nếu không thì tạo nhóm mới. Mỗi đội bị giới hạn 1.000 nhóm.",
                    "type": "string",
                    "maxLength": 50,
                    "example": ""
                  },
                  "isEncrypt": {
                    "description": "Bật mã hóa đầu cuối? 0: Không, 1: Có; mặc định: 0",
                    "type": "integer"
                  },
                  "operatorSystemId": {
                    "description": "Loại hệ điều hành: 1: Windows, 2: macOS, 3: Android, 4: iOS",
                    "type": "integer",
                    "example": 1
                  },
                  "quantity": {
                    "description": "Số lượng môi trường cần tạo; phạm vi: [1–50]",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 50,
                    "example": 1
                  },
                  "browserCore": {
                    "description": "Phiên bản nhân trình duyệt; mặc định: 0 (tự động khớp). Lấy các phiên bản khả dụng thông qua '/api/env/advanced/ua/versions'",
                    "type": "integer",
                    "example": 140
                  },
                  "proxy": {
                    "type": "object",
                    "properties": {
                      "proxyId": {
                        "description": "ID ủy quyền",
                        "type": "string"
                      },
                      "proxyName": {
                        "description": "Tên máy chủ proxy (tối đa 600 ký tự)",
                        "type": "string"
                      },
                      "proxyType": {
                        "description": "Loại proxy, 0: http, 1: https. Không được để trống khi proxyProvider là 7/8",
                        "type": "integer"
                      },
                      "proxyProvider": {
                        "description": "Loại proxy 0: http, 1: https, 2: socks5, 3: ssh, 4: Oxylabs, 5: Proxys.io, 7: Luminati, 8: Lumauto, 9: Oxylabsauto, 10: Trojan, 11: Shadowsocks, 13: ABCPROXY, 14: LunaProxy, 15: IPHTML, 16: PiaProxy, 17: 922S5, 18: 360Proxy",
                        "type": "string"
                      },
                      "proxyIp": {
                        "description": "Địa chỉ IP proxy. Có thể để trống khi proxyProvider là 16/17/18; bắt buộc đối với các trường hợp khác.",
                        "type": "string"
                      },
                      "proxyPort": {
                        "description": "Cổng proxy (chỉ cho phép các số từ 1-65535). Có thể để trống khi proxyProvider là 16/17/18; bắt buộc đối với các trường hợp khác.",
                        "type": "integer"
                      },
                      "username": {
                        "description": "Tên người dùng (tối đa 200 ký tự)",
                        "type": "string"
                      },
                      "password": {
                        "description": "Mật khẩu (tối đa 100 ký tự)",
                        "type": "string"
                      },
                      "refreshUrl": {
                        "description": "Làm mới URL",
                        "type": "string"
                      },
                      "country": {
                        "description": "Quốc gia (mã quốc gia cụ thể, xem phụ lục). Bắt buộc khi proxyProvider là 16/17/18",
                        "type": "string"
                      },
                      "city": {
                        "description": "Thành phố",
                        "type": "string"
                      },
                      "state": {
                        "description": "Tiểu bang/Tỉnh",
                        "type": "string"
                      },
                      "encryptionType": {
                        "description": "Phương thức mã hóa. Không được để trống khi proxyProvider là 11. 1: aes-128-gcm, 2: aes-192-gcm, 3: aes-256-gcm, 4: aes-128-cfb, 5: aes-192-cfb, 6: aes-256-cfb, 7: aes-128-ctr, 8: aes-192-ctr, 9: aes-256-ctr, 10: rc4-md5, 11: chacha20-ietf, 12: xchacha20, 13: chacha20-ietf-poly1305, 14: xchacha20-ietf-poly1305",
                        "type": "integer"
                      },
                      "ipMonitor": {
                        "description": "Cho phép theo dõi thay đổi địa chỉ IP? true: Bật, false: Tắt",
                        "type": "boolean"
                      },
                      "ipChangeAction": {
                        "description": "Giám sát thay đổi địa chỉ IP: 0: Chặn truy cập, 1: Cảnh báo",
                        "type": "integer"
                      }
                    },
                    "description": "Máy chủ proxy"
                  }
                },
                "required": [
                  "browserTypeId",
                  "operatorSystemId",
                  "quantity"
                ]
              },
              "example": {
                "browserTypeId": 1,
                "operatorSystemId": 1,
                "quantity": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là mảng chuỗi, và là mảng rỗng khi không có gì để trả về.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    "string"
                  ],
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/create/advanced": {
      "post": {
        "operationId": "createBrowserProfileAdvancedLocal",
        "summary": "Tạo hồ sơ trình duyệt nâng cao",
        "deprecated": false,
        "description": "Tạo một profile trình duyệt với cấu hình dấu vân tay đầy đủ.\n- **Điều kiện tiên quyết**: cùng các bước kiểm tra gói và hạn mức trong ngày như khi tạo nhanh. Tên profile phải là duy nhất trong nhóm, tọa độ phải nằm ngoài Trung Quốc đại lục, và `advancedSetting.ua` phải nhất quán với `uaVersion`. Nếu bạn truyền `proxyId`, nó phải đã tồn tại trong nhóm.\n- **Tác động**: chèn profile, thông tin đăng nhập của nó (được mã hóa khi lưu) và cấu hình sau khi khởi động; tiêu tốn dung lượng của gói và bộ đếm tạo trong ngày. Một URL nền tảng tùy chỉnh còn tạo thêm một bản ghi site.\n- **Hoàn tất**: đồng bộ. `data` chứa ID của profile mới.\n- **Thử lại**: không idempotent. Lệnh gọi thứ hai với cùng một `envName` chỉ định rõ sẽ thất bại ở bước kiểm tra trùng tên; nếu không đặt tên thì nó tạo ra một bản trùng lặp. Không có khóa idempotency. Đừng thử lại một cách mù quáng sau khi hết thời gian chờ: hãy truy vấn trạng thái trước.\n- **Local API**: các kernel ứng viên được lọc theo phiên bản client desktop đang chạy, và các lệnh gọi đồng thời từ cùng một nhóm được xếp tuần tự bằng khóa ở cấp nhóm.\n\nCác mã lỗi nghiệp vụ đã ghi nhận: `19001`, `19002`, `19004`, `19005`, `19063`, `19064`, `19100`, `19101`, `19102`, `19103`, `19104`, `19105`, `19106`, `19107`, `19108`, `19109`, `19110`, `19111`, `19112`, `19141`, `19175`. Xem [Error Codes](../Getting%20Started/error-codes.md) để biết ý nghĩa từng mã. Mọi thao tác cũng có thể trả về các mã dùng chung.",
        "tags": [
          "Profiles"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateEnvironmentRequest"
              },
              "example": {
                "browserTypeId": 1,
                "operatorSystemId": 1,
                "isEncrypt": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là một giá trị chuỗi duy nhất.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "string"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": "string",
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/update": {
      "post": {
        "operationId": "updateBrowserProfileLocal",
        "summary": "Chỉnh sửa hồ sơ trình duyệt",
        "deprecated": false,
        "description": "Cập nhật một profile trình duyệt hiện có. Chỉ các trường xuất hiện trong yêu cầu bị thay đổi.\n- **Điều kiện tiên quyết**: profile phải tồn tại trong nhóm. Không thể cập nhật các profile được mã hóa đầu-cuối. Không thể thay đổi hệ điều hành và loại trình duyệt. Một profile đang chạy vẫn cập nhật được.\n- **Tác động**: ghi bản ghi profile, các thiết lập mở rộng và cookie của nó, và hợp nhất các thiết lập dấu vân tay nâng cao (các giá trị hiện có được giữ lại trừ khi bị ghi đè).\n- **Hoàn tất**: đồng bộ.\n- **Thử lại**: an toàn khi gọi lại với cùng một request body. Lưu ý là không có khóa lạc quan: các lần cập nhật đồng thời lên cùng một profile sẽ lấy lần ghi cuối cùng, và việc hợp nhất dấu vân tay đọc trước khi ghi, nên các lệnh gọi song song có thể làm mất thay đổi.\n\nCác mã lỗi nghiệp vụ đã ghi nhận: `19001`, `19039`, `19104`, `19105`, `19106`, `19107`, `19108`, `19142`, `19159`, `19160`, `19175`, `19193`. Xem [Error Codes](../Getting%20Started/error-codes.md) để biết ý nghĩa từng mã. Mọi thao tác cũng có thể trả về các mã dùng chung.",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateEnvironmentRequest"
              },
              "example": {
                "browserTypeId": 1,
                "operatorSystemId": 1,
                "isEncrypt": 1,
                "envId": "1661515884160372"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` luôn là null với thao tác này; kết quả được thể hiện qua `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/removeToRecycleBin/batch": {
      "post": {
        "summary": "Xóa hồ sơ trình duyệt",
        "operationId": "batchDeleteBrowserProfilesUsingPOST",
        "deprecated": false,
        "description": "Chuyển một hoặc nhiều profile trình duyệt vào thùng rác.\n- **Điều kiện tiên quyết**: profile không được đang ở trong thùng rác, không được đang chạy, và không được đang trong quá trình chuyển giao. Hãy đóng trình duyệt trước.\n- **Tác động**: đây là xóa mềm. Bản ghi, dấu vân tay và cache trên cloud đều được giữ lại, và profile được đánh dấu là đã chuyển vào thùng rác kèm mốc thời gian. Dung lượng của gói được giải phóng ngay, nhưng bộ đếm tạo trong ngày không được hoàn lại.\n- **Hoàn tất**: đồng bộ.\n- **Phục hồi**: việc khôi phục từ thùng rác không được mở trên bề mặt API — hãy dùng client MoreLogin hoặc web console.\n- **Thử lại**: gọi lại sẽ báo profile đã bị xóa; nó không thể xóa hai lần.",
        "tags": [
          "Profiles"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "envIds"
                ],
                "properties": {
                  "envIds": {
                    "type": "array",
                    "description": "Danh sách ID môi trường (hồ sơ trình duyệt) cần xóa.",
                    "items": {
                      "type": "string",
                      "example": "1868548141708648448"
                    },
                    "minItems": 1,
                    "example": [
                      "1868548141708648448",
                      "1868548141708648449"
                    ]
                  },
                  "removeEnvData": {
                    "type": "boolean",
                    "description": "Cũng có thể xóa các tệp cấu hình cục bộ?\n\nĐược hỗ trợ từ phiên bản 2.28.0 trở lên.\n",
                    "default": false,
                    "example": false
                  }
                }
              },
              "example": {
                "envIds": [
                  "1868548141708648448"
                ],
                "removeEnvData": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là một giá trị boolean duy nhất.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/page": {
      "post": {
        "summary": "Lấy danh sách các hồ sơ trình duyệt",
        "operationId": "listBrowserProfilesUsingPOST",
        "deprecated": false,
        "description": "Liệt kê theo trang các profile trình duyệt mà thành viên đã xác thực nhìn thấy.\n- **Tác động**: không có. Chỉ đọc. An toàn khi thử lại với thời gian chờ tăng dần có giới hạn.\n- **Bộ lọc**: `keyword` khớp với tên profile, ghi chú, tên thẻ và tên nhóm. `groupId` bằng `0` nghĩa là chưa thuộc nhóm nào.\n- **Lưu ý**: mật khẩu proxy không được trả về cho thành viên thường, cũng như với proxy nền tảng và proxy động.",
        "tags": [
          "Profiles"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "envName": {
                    "type": "string",
                    "description": "Lọc theo tên môi trường (hồ sơ). Chuỗi rỗng sẽ trả về tất cả.",
                    "example": ""
                  },
                  "groupId": {
                    "type": "string",
                    "description": "Lọc theo ID nhóm. Sử dụng 0 cho các hồ sơ chưa được nhóm.",
                    "default": 0,
                    "example": "0"
                  },
                  "envId": {
                    "type": "string",
                    "description": "Lọc theo ID môi trường cụ thể.\n\nNếu được cung cấp, các bộ lọc khác có thể bị bỏ qua.\n",
                    "example": "1869988538611834880"
                  },
                  "pageNo": {
                    "type": "integer",
                    "description": "Số trang (chỉ mục bắt đầu từ 1).",
                    "default": 1,
                    "minimum": 1,
                    "example": 1
                  },
                  "pageSize": {
                    "type": "integer",
                    "description": "Số lượng mục trên mỗi trang.",
                    "default": 10,
                    "minimum": 1,
                    "maximum": 100,
                    "example": 10
                  }
                }
              },
              "example": {
                "pageNo": 1,
                "pageSize": 10
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data.dataList` chứa các bản ghi của trang được yêu cầu và là mảng rỗng khi không có kết quả khớp; `data.total`, `data.current` và `data.pages` mô tả phân trang.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "total": {
                          "type": "string"
                        },
                        "current": {
                          "type": "string"
                        },
                        "pages": {
                          "type": "string"
                        },
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "ID hồ sơ trình duyệt"
                              },
                              "envName": {
                                "type": "string",
                                "description": "Tên hồ sơ"
                              },
                              "groupId": {
                                "type": "string",
                                "description": "ID nhóm"
                              },
                              "groupName": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Tên nhóm. `null` khi hồ sơ không thuộc nhóm nào"
                              },
                              "tagInfos": {
                                "type": "array",
                                "description": "Chi tiết thẻ. Mảng rỗng khi không có thẻ nào được gán",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "id": {
                                      "type": "string",
                                      "description": "ID thẻ"
                                    },
                                    "tagColor": {
                                      "type": "string",
                                      "enum": [
                                        "red",
                                        "blue",
                                        "green",
                                        "yellow",
                                        "purple"
                                      ],
                                      "description": "Màu thẻ. Bỏ qua hoặc để trống sẽ dùng red; chỉ chấp nhận tên màu, không dùng mã thập lục phân.",
                                      "example": "red"
                                    },
                                    "tagName": {
                                      "type": "string",
                                      "description": "Tên thẻ"
                                    }
                                  },
                                  "required": [
                                    "id",
                                    "tagName"
                                  ]
                                }
                              },
                              "envRemark": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Ghi chú hồ sơ"
                              },
                              "proxyId": {
                                "type": "string",
                                "description": "ID proxy. `0` nghĩa là không có proxy"
                              },
                              "proxy": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Cấu hình proxy. `null` khi không có proxy được gán",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "ID proxy"
                                  },
                                  "proxyName": {
                                    "type": "string",
                                    "description": "Tên proxy"
                                  },
                                  "proxyType": {
                                    "type": "integer",
                                    "description": "Loại proxy"
                                  },
                                  "proxyProvider": {
                                    "type": "integer",
                                    "description": "Loại proxy"
                                  },
                                  "proxyCategoryType": {
                                    "type": "integer",
                                    "description": "Loại danh mục proxy"
                                  },
                                  "proxyCheckStatus": {
                                    "type": "integer",
                                    "description": "Trạng thái kiểm tra proxy"
                                  },
                                  "proxyStatus": {
                                    "type": "integer",
                                    "description": "Trạng thái proxy"
                                  },
                                  "state": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Bang hoặc tỉnh của proxy. Ưu tiên vị trí IP đầu ra được phát hiện, sau đó dùng vị trí cấu hình; có thể là null hoặc chuỗi rỗng.",
                                    "example": "California"
                                  },
                                  "city": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Thành phố của proxy. Ưu tiên vị trí IP đầu ra được phát hiện, sau đó dùng vị trí cấu hình; có thể là null hoặc chuỗi rỗng.",
                                    "example": "Los Angeles"
                                  },
                                  "proxyPort": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "format": "int32",
                                    "description": "Cổng kết nối proxy, không suy ra từ tên proxy. Có thể là null nếu không có.",
                                    "example": 1080
                                  },
                                  "proxyIp": {
                                    "type": "string",
                                    "description": "Địa chỉ IP proxy"
                                  },
                                  "exportIp": {
                                    "type": "string",
                                    "description": "Địa chỉ IP đầu ra"
                                  },
                                  "countryCode": {
                                    "type": "string",
                                    "description": "Mã quốc gia"
                                  },
                                  "expiryTime": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Dấu thời gian hết hạn"
                                  },
                                  "username": {
                                    "type": "string",
                                    "description": "Tên người dùng proxy"
                                  },
                                  "password": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Mật khẩu proxy"
                                  },
                                  "refreshUrl": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "URL làm mới proxy"
                                  }
                                }
                              }
                            }
                          }
                        }
                      },
                      "required": [
                        "total",
                        "current",
                        "pages",
                        "dataList"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "total": "1",
                    "current": "1",
                    "pages": "1",
                    "dataList": [
                      {
                        "id": "1673823102599682",
                        "envName": "example-name",
                        "groupId": "1673823102599682",
                        "groupName": "example-name",
                        "tagInfos": [
                          {
                            "id": "1673823102599682",
                            "tagColor": "red",
                            "tagName": "example-name"
                          }
                        ],
                        "envRemark": "example remark",
                        "proxyId": "1673823102599682",
                        "proxy": {
                          "id": "1673823102599682",
                          "proxyName": "example-name",
                          "proxyType": 1,
                          "proxyProvider": 1,
                          "proxyCategoryType": 1,
                          "proxyCheckStatus": 1,
                          "proxyStatus": 1,
                          "state": "California",
                          "city": "Los Angeles",
                          "proxyPort": 1080,
                          "proxyIp": "string",
                          "exportIp": "9222",
                          "countryCode": "string",
                          "expiryTime": "2026-09-01 12:00:00",
                          "username": "example-name",
                          "password": "string",
                          "refreshUrl": "https://example.com/resource"
                        }
                      }
                    ]
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/detail": {
      "post": {
        "summary": "Lấy thông tin chi tiết hồ sơ trình duyệt",
        "operationId": "getBrowserProfileDetailsUsingPOST",
        "deprecated": false,
        "description": "Trả về toàn bộ cấu hình của một profile trình duyệt, gồm cả thiết lập dấu vân tay nâng cao và cookie.\n- **Điều kiện tiên quyết**: profile phải tồn tại trong nhóm và bên gọi phải có quyền với nó.\n- **Tác động**: không có. Chỉ đọc. An toàn khi thử lại với thời gian chờ tăng dần có giới hạn.\n- **Lưu ý**: mật khẩu tài khoản và khóa bí mật 2FA chỉ được trả về cho chủ nhóm, hoặc khi profile không được cấu hình để ẩn chúng.",
        "tags": [
          "Profiles"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "envId"
                ],
                "properties": {
                  "envId": {
                    "type": "string",
                    "description": "ID môi trường mục tiêu (hồ sơ trình duyệt)",
                    "example": "1869988538611834880"
                  }
                }
              },
              "example": {
                "envId": "1869988538611834880"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là một đối tượng với các trường `id`, `envName`, `browserTypeId`, `operatorSystemId`, `groupId`, `groupName`, ….",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "envName": {
                          "type": "string"
                        },
                        "browserTypeId": {
                          "type": "integer"
                        },
                        "operatorSystemId": {
                          "type": "integer"
                        },
                        "groupId": {
                          "type": "string"
                        },
                        "groupName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Tên nhóm. `null` khi hồ sơ không thuộc nhóm nào"
                        },
                        "tagInfos": {
                          "type": "array",
                          "description": "Chi tiết thẻ. Mảng rỗng khi không có thẻ nào được gán",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "ID thẻ"
                              },
                              "tagColor": {
                                "type": "string",
                                "enum": [
                                  "red",
                                  "blue",
                                  "green",
                                  "yellow",
                                  "purple"
                                ],
                                "description": "Màu thẻ. Bỏ qua hoặc để trống sẽ dùng red; chỉ chấp nhận tên màu, không dùng mã thập lục phân.",
                                "example": "red"
                              },
                              "tagName": {
                                "type": "string",
                                "description": "Tên thẻ"
                              }
                            },
                            "required": [
                              "id",
                              "tagName"
                            ]
                          }
                        },
                        "proxyId": {
                          "type": "string"
                        },
                        "isEncrypt": {
                          "type": "integer"
                        },
                        "envRemark": {
                          "type": "string"
                        },
                        "uaVersion": {
                          "type": "integer"
                        },
                        "browserCore": {
                          "type": "integer"
                        },
                        "accountInfo": {
                          "type": "object",
                          "properties": {
                            "username": {
                              "type": "string"
                            },
                            "password": {
                              "type": "string"
                            },
                            "siteId": {
                              "type": "string"
                            },
                            "platformId": {
                              "type": "string"
                            },
                            "customerUrl": {
                              "type": "string"
                            },
                            "otpSecret": {
                              "type": "null"
                            }
                          },
                          "required": [
                            "username",
                            "password",
                            "siteId",
                            "platformId",
                            "customerUrl",
                            "otpSecret"
                          ]
                        },
                        "isShowAccount": {
                          "type": "integer"
                        },
                        "afterStartupConfig": {
                          "type": "object",
                          "properties": {
                            "afterStartup": {
                              "type": "integer"
                            },
                            "autoOpenUrls": {
                              "type": "array",
                              "items": {}
                            },
                            "platformUrl": {
                              "type": "null"
                            }
                          },
                          "required": [
                            "afterStartup",
                            "autoOpenUrls",
                            "platformUrl"
                          ]
                        },
                        "startupParams": {
                          "type": "null"
                        },
                        "cookies": {
                          "type": "null"
                        },
                        "advancedSetting": {
                          "type": "object",
                          "properties": {}
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "id": "1673823102599682",
                    "envName": "example-name",
                    "browserTypeId": 1,
                    "operatorSystemId": 1,
                    "groupId": "1673823102599682",
                    "groupName": "example-name",
                    "tagInfos": [
                      {
                        "id": "1673823102599682",
                        "tagColor": "red",
                        "tagName": "example-name"
                      }
                    ],
                    "proxyId": "1673823102599682",
                    "isEncrypt": 1,
                    "envRemark": "example remark",
                    "uaVersion": 1,
                    "browserCore": 1,
                    "accountInfo": {
                      "username": "example-name",
                      "password": "string",
                      "siteId": "1673823102599682",
                      "platformId": "1673823102599682",
                      "customerUrl": "https://example.com/resource",
                      "otpSecret": null
                    },
                    "isShowAccount": 1,
                    "afterStartupConfig": {
                      "afterStartup": 1,
                      "autoOpenUrls": [],
                      "platformUrl": null
                    },
                    "startupParams": null,
                    "cookies": null,
                    "advancedSetting": {}
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/advanced/ua/versions": {
      "get": {
        "operationId": "listAdvancedUaVersionsLocal",
        "summary": "Lấy danh sách các phiên bản nhân trình duyệt",
        "deprecated": false,
        "description": "Trả về các kernel trình duyệt đã phát hành và các phiên bản chính của user agent.\n- **Tác động**: không có. Chỉ đọc. An toàn khi thử lại với thời gian chờ tăng dần có giới hạn.\n- **Nội dung**: bề mặt Open API chỉ trả về các kernel đã phát hành, còn bề mặt Local API lọc theo phiên bản client đang chạy, nên hai bề mặt có thể trả về những tập khác nhau. Danh sách thay đổi khi có kernel mới được phát hành.\n- **Lưu ý**: một lỗi ở dịch vụ thượng nguồn cho ra danh sách rỗng thay vì lỗi, nên hãy coi kết quả rỗng là chưa kết luận được.\n- **Local API**: danh sách được lọc theo phiên bản client desktop đang chạy.",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Thành công. `data` là mảng các đối tượng với các trường `browserType` và `versions`, và là mảng rỗng khi không có gì để trả về.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "browserType": {
                            "type": "integer"
                          },
                          "versions": {
                            "type": "array",
                            "items": {
                              "type": "integer"
                            }
                          }
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    {
                      "browserType": 1,
                      "versions": [
                        1
                      ]
                    }
                  ],
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/advanced/ua/get": {
      "post": {
        "summary": "Lấy thông tin UA hồ sơ trình duyệt",
        "operationId": "getBrowserProfileUAUsingPOST",
        "deprecated": false,
        "description": "Sinh một user agent khớp với hệ điều hành và nhà sản xuất trình duyệt được yêu cầu.\n- **Điều kiện tiên quyết**: Firefox chỉ hợp lệ với Windows hoặc macOS, và `osVersion` phải là một trong các bản phát hành được hỗ trợ.\n- **Tác động**: không có, nhưng **kết quả không xác định trước được** — cùng một yêu cầu sẽ trả về một user agent khác mỗi lần. Đừng dùng nó làm khóa cache.\n- **Hoàn tất**: đồng bộ. Thử lại an toàn.",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "os"
                ],
                "properties": {
                  "os": {
                    "type": "integer",
                    "description": "Loại hệ điều hành.\n\n1 = Windows, 2 = macOS, 3 = Android, 4 = iOS\n",
                    "enum": [
                      1,
                      2,
                      3,
                      4
                    ],
                    "example": 1
                  },
                  "osVersion": {
                    "type": "string",
                    "description": "Phiên bản hệ điều hành (ví dụ: \"Windows 11\", \"macOS 14\").\n",
                    "example": "Windows 11"
                  },
                  "vendor": {
                    "type": "integer",
                    "description": "Loại trình duyệt.\n\n1 = Chrome, 2 = Firefox\n",
                    "enum": [
                      1,
                      2
                    ],
                    "example": 1
                  }
                }
              },
              "example": {
                "os": 1,
                "osVersion": "Windows 11",
                "vendor": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` luôn là null với thao tác này; kết quả được thể hiện qua `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "resolution": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "value": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "value"
                      ]
                    },
                    "ua": {
                      "type": "string"
                    },
                    "requestId": {
                      "type": "string"
                    },
                    "error": {
                      "type": "object",
                      "properties": {}
                    }
                  },
                  "required": [
                    "resolution",
                    "ua"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "resolution": {
                    "id": "1673823102599682",
                    "value": "string"
                  },
                  "ua": "string",
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "error": {}
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/base/resolution/list": {
      "post": {
        "summary": "Tìm độ phân giải",
        "operationId": "listResolutionsUsingPOST",
        "deprecated": false,
        "description": "Trả về các độ phân giải màn hình khả dụng cho một user agent hoặc hệ điều hành.\n- **Tác động**: không có. Chỉ đọc. An toàn khi thử lại với thời gian chờ tăng dần có giới hạn.\n- **Nội dung**: dữ liệu do dịch vụ dữ liệu nền của dấu vân tay cung cấp, nên danh sách thay đổi theo mỗi lần dữ liệu đó được cập nhật.",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "os": {
                    "type": "integer",
                    "description": "Loại hệ điều hành (1=Windows, 2=macOS, 3=Android, 4=iOS)",
                    "example": 1
                  },
                  "ua": {
                    "type": "string",
                    "description": "Chuỗi User-Agent (tùy chọn)",
                    "example": ""
                  }
                },
                "required": [
                  "os"
                ]
              },
              "example": {
                "os": 1,
                "ua": ""
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là mảng các đối tượng với các trường `id` và `value`, và là mảng rỗng khi không có gì để trả về.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "value": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    {
                      "id": "1673823102599682",
                      "value": "string"
                    }
                  ],
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/system/platform/list": {
      "get": {
        "operationId": "listSystemPlatformsLocal",
        "summary": "Nhận được các nền tảng có thể cấu hình",
        "deprecated": false,
        "description": "Trả về các nền tảng và site có thể gán cho một profile trình duyệt.\n- **Tác động**: không có. Chỉ đọc. An toàn khi thử lại với thời gian chờ tăng dần có giới hạn.\n- **Nội dung**: các nền tảng và site hệ thống được đánh dấu để hiển thị, cộng với các URL site tùy chỉnh của riêng nhóm đang gọi. Vì vậy danh sách thay đổi cả khi MoreLogin phát hành nền tảng mới, và cả khi nhóm bạn thêm một URL tùy chỉnh qua luồng tạo nâng cao.",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Thành công. `data` là mảng các đối tượng với các trường `id`, `categoryId`, `groupName`, `groups`, `isCustomer`, `logo`, …, và là mảng rỗng khi không có gì để trả về.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "description": "ID nền tảng"
                          },
                          "categoryId": {
                            "type": "string",
                            "description": "Mã định danh mục"
                          },
                          "groupName": {
                            "type": "string",
                            "description": "Tên nhóm"
                          },
                          "groups": {
                            "type": "string",
                            "description": "Nhóm, 0: Amazon"
                          },
                          "isCustomer": {
                            "type": "boolean",
                            "description": "Liệu có nên tùy chỉnh nền tảng hay không?"
                          },
                          "logo": {
                            "type": "string",
                            "description": "Logo nền tảng"
                          },
                          "name": {
                            "type": "string",
                            "description": "Tên nền tảng"
                          },
                          "orderNo": {
                            "type": "string",
                            "description": "Số thứ tự"
                          },
                          "sites": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "id": {
                                  "type": "string",
                                  "description": "Mã định danh trang web"
                                },
                                "host": {
                                  "type": "string",
                                  "description": "Tên miền trang web"
                                },
                                "name": {
                                  "type": "string",
                                  "description": "Tên kích thước"
                                },
                                "nameBak": {
                                  "type": "string",
                                  "description": "Tên kích thước sao lưu"
                                },
                                "logo": {
                                  "type": "string",
                                  "description": "Logo"
                                },
                                "url": {
                                  "type": "string",
                                  "description": "URL kích thước"
                                },
                                "isDefault": {
                                  "type": "boolean"
                                },
                                "country": {
                                  "type": "string",
                                  "description": "Quốc gia"
                                }
                              },
                              "required": [
                                "id",
                                "host",
                                "name",
                                "logo",
                                "nameBak",
                                "url",
                                "isDefault",
                                "country"
                              ]
                            },
                            "description": "Thông tin trang web"
                          }
                        },
                        "required": [
                          "id",
                          "categoryId",
                          "groupName",
                          "groups",
                          "isCustomer",
                          "logo",
                          "name",
                          "orderNo",
                          "sites"
                        ]
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    {
                      "id": "1673823102599682",
                      "categoryId": "1673823102599682",
                      "groupName": "example-name",
                      "groups": "string",
                      "isCustomer": true,
                      "logo": "string",
                      "name": "example-name",
                      "orderNo": "string",
                      "sites": [
                        {
                          "id": "1673823102599682",
                          "host": "string",
                          "name": "example-name",
                          "nameBak": "example-name",
                          "logo": "string",
                          "url": "https://example.com/resource",
                          "isDefault": true,
                          "country": "string"
                        }
                      ]
                    }
                  ],
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/lock/query": {
      "post": {
        "summary": "Lấy trạng thái khóa bảo mật trình duyệt",
        "operationId": "queryBrowserLockStatusUsingPOST",
        "deprecated": false,
        "description": "Báo cho biết một profile trình duyệt hiện có đang bị thành viên khác trong nhóm chiếm giữ hay không.\n- **Tác động**: không có. Chỉ đọc. An toàn khi thử lại với thời gian chờ tăng dần có giới hạn.\n- **Ngữ nghĩa**: để có giá trị `true` cần đủ tất cả các điều kiện — nhóm đã bật tính năng khóa bảo mật, khóa đang tồn tại, và người giữ khóa là một người khác chứ không phải bên gọi. Khóa được giữ theo từng thành viên và có thời hạn, nên nó có thể tự hết hiệu lực.",
        "tags": [
          "Profiles"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "envId"
                ],
                "properties": {
                  "envId": {
                    "type": "string",
                    "description": "ID môi trường duy nhất (hồ sơ trình duyệt)",
                    "example": "1869988538611834880"
                  }
                }
              },
              "example": {
                "envId": "1869988538611834880"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là một đối tượng với các trường `envId` và `locked`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "envId": {
                          "type": "string"
                        },
                        "locked": {
                          "type": "boolean"
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "envId": "1673823102599682",
                    "locked": true
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/base/list": {
      "post": {
        "summary": "Lấy danh sách múi giờ và ngôn ngữ",
        "operationId": "listTimezoneAndLanguageUsingPOST",
        "deprecated": false,
        "description": "Trả về các múi giờ và ngôn ngữ khả dụng cho profile trình duyệt.\n- **Tác động**: không có. Chỉ đọc. An toàn khi thử lại với thời gian chờ tăng dần có giới hạn.\n- **Lưu ý**: hiện tại phản hồi không phụ thuộc vào request body — dịch vụ không chuyển tiếp hệ điều hành hay ngôn ngữ được yêu cầu xuống hạ nguồn, nên cùng một danh sách được trả về bất kể đầu vào.",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "os"
                ],
                "properties": {
                  "os": {
                    "type": "integer",
                    "description": "Loại hệ điều hành.\n\n1 = Windows, 2 = macOS, 3 = Android, 4 = iOS\n",
                    "enum": [
                      1,
                      2,
                      3,
                      4
                    ],
                    "example": 1
                  }
                }
              },
              "example": {
                "os": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là một đối tượng với các trường `time_zone_list` và `language_list`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "time_zone_list": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "value": {
                                "type": "string"
                              }
                            }
                          }
                        },
                        "language_list": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "value": {
                                "type": "string"
                              }
                            }
                          }
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "time_zone_list": [
                      {
                        "id": "1673823102599682",
                        "value": "string"
                      }
                    ],
                    "language_list": [
                      {
                        "id": "1673823102599682",
                        "value": "string"
                      }
                    ]
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/removeLocalCache": {
      "post": {
        "summary": "Xóa bộ nhớ đệm hồ sơ cục bộ",
        "operationId": "clearLocalProfileCacheUsingPOST",
        "deprecated": false,
        "description": "Yêu cầu client MoreLogin cục bộ xóa dữ liệu cache của một profile trình duyệt.\n- **Điều kiện tiên quyết**: xác định profile bằng `envId` hoặc `uniqueId` và chọn ít nhất một loại cache. Profile Firefox phải chọn tất cả các loại cùng lúc.\n- **Tác động**: dịch vụ kiểm tra yêu cầu và ghi nhận nó; **việc xóa thực sự do client desktop thực hiện trên ổ đĩa cục bộ.** Cache phía cloud không bị tác động — hãy dùng endpoint cache trên cloud cho việc đó.\n- **Hoàn tất**: phản hồi xác nhận dịch vụ đã tiếp nhận yêu cầu, không phải các tệp cục bộ đã bị xóa. Không có endpoint nào báo về trạng thái ổ đĩa cục bộ.",
        "tags": [
          "Cache & Window"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "envId"
                ],
                "properties": {
                  "envId": {
                    "type": "string",
                    "description": "Mã định danh môi trường. Phải cung cấp chính xác một trong hai giá trị `envId` hoặc `uniqueId`.\n"
                  },
                  "localStorage": {
                    "type": "boolean",
                    "description": "Xóa bộ nhớ cục bộ (Mặc định: false)",
                    "default": false
                  },
                  "indexedDB": {
                    "type": "boolean",
                    "description": "Xóa IndexedDB mặc định: false",
                    "default": false
                  },
                  "cookie": {
                    "type": "boolean",
                    "description": "Xóa cookie Mặc định: false",
                    "default": false
                  },
                  "extension": {
                    "type": "boolean",
                    "description": "Xóa dữ liệu phần mở rộng. Nếu `extensionFile` không được cung cấp,\nsẽ xóa cả tên và dữ liệu phần mở rộng. Mặc định: false\n",
                    "default": false
                  },
                  "extensionFile": {
                    "type": "boolean",
                    "description": "Xóa các tập tin mở rộng (có hiệu lực từ phiên bản 3.36).\n",
                    "default": false
                  }
                }
              },
              "example": {
                "envId": "1924340272932134912",
                "localStorage": false,
                "indexedDB": false,
                "cookie": false,
                "extension": false,
                "extensionFile": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là một đối tượng với các trường `envId`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "envId": {
                          "type": "string"
                        }
                      }
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Định danh yêu cầu duy nhất; hãy cung cấp khi liên hệ hỗ trợ"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "envId": "1673823102599682"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/env/cache/cleanCloud": {
      "post": {
        "operationId": "cleanCloudCacheLocal",
        "summary": "Bộ nhớ đệm đám mây môi trường sạch",
        "deprecated": false,
        "description": "Xóa cache phía cloud của một profile trình duyệt.\n- **Điều kiện tiên quyết**: xác định profile bằng `envId` hoặc `uniqueId`, chọn ít nhất một loại cache, và profile không được đang trong quá trình chuyển giao. Cache cục bộ của client không bị tác động.\n- **Tác động**: xóa loại cache chung sẽ loại bỏ LocalStorage, IndexedDB và dữ liệu tiện ích mở rộng trên cloud, hủy liên kết các tiện ích của profile, và **đặt lại kiểu mã hóa của profile**; xóa cookie sẽ đặt lại kiểu mã hóa của cookie. Cả hai thay đổi đều được lưu lại, nên một profile đã mã hóa sẽ trở thành không mã hóa đối với loại cache đã xóa.\n- **Hoàn tất**: đồng bộ — dịch vụ lưu trữ trên cloud đã tiếp nhận và trả về trước khi phản hồi được gửi đi. Không có task ID nào để hỏi vòng.\n\nCác mã lỗi nghiệp vụ đã ghi nhận: `19039`, `19149`. Xem [Error Codes](../Getting%20Started/error-codes.md) để biết ý nghĩa từng mã. Mọi thao tác cũng có thể trả về các mã dùng chung.",
        "tags": [
          "Cache & Window"
        ],
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "description": "Ngôn ngữ yêu cầu mặc định",
            "required": false,
            "example": "zh-CN",
            "schema": {
              "type": "string",
              "default": "zh-CN"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "cookie": {
                    "description": "Có nên xóa cookie hay không",
                    "type": "boolean"
                  },
                  "envId": {
                    "description": "Mã môi trường, phải điền mã số sê-ri.",
                    "type": "string"
                  },
                  "others": {
                    "description": "Liệu có nên xóa bộ nhớ đệm khác hay không",
                    "type": "boolean"
                  },
                  "uniqueId": {
                    "description": "Mã số sê-ri, phải điền mã số môi trường.",
                    "type": "integer"
                  }
                }
              },
              "example": {
                "cookie": true,
                "envId": "1661515884160372",
                "others": true
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` luôn là null với thao tác này; kết quả được thể hiện qua `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "requestId": "ca3b32431c264b6c94187fde14d23229"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/fingerprint/refresh": {
      "post": {
        "summary": "Làm mới dấu vân tay",
        "operationId": "refreshFingerprintUsingPOST",
        "deprecated": false,
        "description": "Sinh lại dấu vân tay của một profile trình duyệt.\n- **Điều kiện tiên quyết**: xác định profile bằng `envId` hoặc `uniqueId`. Profile đã mã hóa sẽ bị từ chối. Một profile đang chạy không bị chặn, nhưng dấu vân tay mới chỉ áp dụng từ lần khởi động kế tiếp.\n- **Tác động**: sinh một dấu vân tay mới, ngẫu nhiên hóa tên host và địa chỉ MAC, và khớp lại kernel trình duyệt. Các giá trị bạn cung cấp trong yêu cầu sẽ thắng các giá trị được sinh ra.\n- **Hoàn tất**: đồng bộ.\n- **Thử lại**: **đừng bao giờ thử lại tự động.** Mỗi lần gọi sinh ra một dấu vân tay ngẫu nhiên khác nhau, nên thử lại mù quáng sau khi hết thời gian chờ sẽ thay đổi profile lần thứ hai. Hãy so sánh bằng `/env/detail` trước.\n\nCác mã lỗi nghiệp vụ đã ghi nhận: `19039`, `19104`, `19105`, `19106`, `19107`, `19108`, `19111`, `19142`, `19193`. Xem [Error Codes](../Getting%20Started/error-codes.md) để biết ý nghĩa từng mã. Mọi thao tác cũng có thể trả về các mã dùng chung.",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "envId"
                ],
                "properties": {
                  "envId": {
                    "type": "string",
                    "description": "Mã định danh hồ sơ (mã định danh môi trường). Phải cung cấp chính xác một trong hai giá trị `envId` hoặc `uniqueId`.\n"
                  },
                  "uniqueId": {
                    "type": "string",
                    "description": "Số sê-ri hồ sơ (mã định danh duy nhất). Phải cung cấp chính xác một trong hai giá trị `envId` hoặc `uniqueId`.\n"
                  },
                  "uaVersion": {
                    "type": "integer",
                    "description": "Phiên bản User-Agent mục tiêu (ví dụ: Chrome 129).\n\nNếu bỏ qua, sẽ sử dụng phiên bản UA hiện tại từ hồ sơ.\n",
                    "example": 129
                  },
                  "browserTypeId": {
                    "type": "integer",
                    "description": "Loại trình duyệt. 1 = Chrome, 2 = Firefox.\n",
                    "enum": [
                      1,
                      2
                    ]
                  },
                  "operatorSystemId": {
                    "type": "integer",
                    "description": "Loại hệ điều hành. 1 = Windows, 2 = macOS, 3 = Android, 4 = iOS.\n",
                    "enum": [
                      1,
                      2,
                      3,
                      4
                    ]
                  },
                  "advancedSetting": {
                    "$ref": "#/components/schemas/AdvancedSetting"
                  }
                }
              },
              "example": {
                "envId": "1869988538611834880",
                "uniqueId": "",
                "uaVersion": 129,
                "browserTypeId": 1,
                "operatorSystemId": 2,
                "advancedSetting": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` luôn là null với thao tác này; kết quả được thể hiện qua `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/status": {
      "post": {
        "operationId": "getBrowserProfileStatusLocal",
        "summary": "Lấy trạng thái hoạt động của hồ sơ trình duyệt",
        "deprecated": false,
        "description": "Trả về trạng thái chạy hiện thời của một hoặc nhiều profile trình duyệt.\n- **Tác động**: không có. Chỉ đọc. An toàn khi thử lại với thời gian chờ tăng dần có giới hạn.\n- **Giá trị**: mỗi profile báo về `running` hoặc `stopped`. Đây là tín hiệu hoàn tất cho các tác vụ mở và đóng trình duyệt.\n- **Lưu ý**: những ID không tra cứu được sẽ bị bỏ qua âm thầm; lệnh gọi chỉ thất bại khi không ID nào tra cứu được.",
        "tags": [
          "Runtime"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "envId": {
                    "description": "ID môi trường trình duyệt",
                    "type": "string"
                  }
                },
                "required": [
                  "envId"
                ]
              },
              "example": {
                "envId": "1957985601221750784"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là một đối tượng với các trường `envId`, `debugPort`, `status`, `localStatus` và `webdriver`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "envId": {
                          "type": "string",
                          "description": "ID môi trường"
                        },
                        "status": {
                          "type": "string"
                        },
                        "localStatus": {
                          "type": "string"
                        },
                        "debugPort": {
                          "type": "string"
                        },
                        "webdriver": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "envId",
                        "debugPort",
                        "status",
                        "localStatus",
                        "webdriver"
                      ]
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Định danh yêu cầu duy nhất; hãy cung cấp khi liên hệ hỗ trợ"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "envId": "1673823102599682",
                    "status": "0",
                    "localStatus": "0",
                    "debugPort": "9222",
                    "webdriver": "string"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/getAllScreen": {
      "post": {
        "operationId": "getAllBrowserScreensLocal",
        "summary": "Lấy danh sách màn hình",
        "deprecated": false,
        "description": "Liệt kê các màn hình mà client có thể sắp xếp cửa sổ lên.\n\n- **Nơi thực thi**: client desktop của MoreLogin xử lý hoàn toàn việc này trên máy của bạn. **Không có phần hiện thực ở phía server**, nên không tồn tại điều kiện tiên quyết nào về tài khoản, nhóm hay trạng thái ngoài việc client đang mở profile, và không có gì được ghi lại trên cloud.\n- **Tác động**: chỉ giới hạn trong các tiến trình và cửa sổ trình duyệt cục bộ. Dữ liệu profile, dấu vân tay và cache trên cloud đều không bị ảnh hưởng.\n- **Hoàn tất**: đồng bộ — client trả lời ngay khi đã thực hiện.\n- **Khả dụng**: chỉ Local API. Open API không có endpoint tương đương, vì nó không có trình duyệt cục bộ nào để tác động. Hãy dùng các endpoint runtime trên cloud thay thế.\n- **Lưu ý**: vì client là bên nắm giữ chức năng này, hình dạng phản hồi phụ thuộc vào phiên bản client đã cài chứ không phải vào một hợp đồng dịch vụ.",
        "tags": [
          "Cache & Window"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              },
              "example": {}
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là mảng các đối tượng với các trường `id`, `scaleFactor`, `width`, `height`, `internal`, `x`, …, và là mảng rỗng khi không có gì để trả về.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "description": "Mã định danh duy nhất của màn hình"
                          },
                          "scaleFactor": {
                            "type": "integer",
                            "description": "Hệ số tỷ lệ màn hình"
                          },
                          "width": {
                            "type": "integer",
                            "description": "Chiều rộng pixel màn hình"
                          },
                          "height": {
                            "type": "integer",
                            "description": "Chiều cao pixel màn hình"
                          },
                          "internal": {
                            "type": "boolean",
                            "description": "Cho biết màn hình có phải là màn hình tích hợp hay không."
                          },
                          "x": {
                            "type": "integer",
                            "description": "Vị trí màn hình trên trục X trong hệ tọa độ ảo"
                          },
                          "y": {
                            "type": "integer",
                            "description": "Vị trí màn hình trên trục Y trong hệ tọa độ ảo."
                          },
                          "current": {
                            "type": "boolean",
                            "description": "Mã định danh của màn hình hiện đang hoạt động"
                          },
                          "realWidth": {
                            "type": "integer",
                            "description": "Chiều rộng vật lý thực tế của màn hình"
                          },
                          "realHeight": {
                            "type": "integer",
                            "description": "Chiều cao thực tế của màn hình"
                          },
                          "workAreaWidth": {
                            "type": "integer",
                            "description": "Độ rộng pixel của vùng làm việc trên màn hình"
                          },
                          "workAreaHeight": {
                            "type": "integer",
                            "description": "Chiều cao pixel của vùng làm việc trên màn hình"
                          },
                          "workAreaRealWidth": {
                            "type": "integer",
                            "description": "Chiều rộng thực tế của khu vực làm việc"
                          },
                          "workAreaRealHeight": {
                            "type": "integer",
                            "description": "Chiều cao thực tế của khu vực làm việc"
                          },
                          "rectWorkAreaWidth": {
                            "type": "integer",
                            "description": "Đã điều chỉnh chiều rộng của khu vực làm việc."
                          },
                          "rectWorkAreaHeight": {
                            "type": "integer",
                            "description": "Chiều cao khu vực làm việc đã được điều chỉnh"
                          },
                          "rectWorkAreaRealWidth": {
                            "type": "integer",
                            "description": "Chiều rộng thực tế của khu vực làm việc đã được hiệu chỉnh"
                          },
                          "rectWorkAreaRealHeight": {
                            "type": "integer",
                            "description": "Chiều cao thực tế của khu vực làm việc đã được hiệu chỉnh"
                          },
                          "rectWorkAreaX": {
                            "type": "integer",
                            "description": "Vị trí trục X của khu vực làm việc đã được hiệu chỉnh"
                          },
                          "rectWorkAreaY": {
                            "type": "integer",
                            "description": "Vị trí trục Y của khu vực làm việc đã được hiệu chỉnh"
                          },
                          "depthPerComponent": {
                            "type": "integer",
                            "description": "Độ chính xác màu sắc trên từng pixel trên màn hình"
                          },
                          "isPrimaryScreen": {
                            "type": "boolean",
                            "description": "Màn hình đó có phải là màn hình chính hay không"
                          }
                        }
                      }
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Định danh yêu cầu duy nhất; hãy cung cấp khi liên hệ hỗ trợ"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    {
                      "width": 1920,
                      "height": 1080,
                      "internal": false,
                      "x": 0,
                      "y": 0,
                      "current": true,
                      "scaleFactor": 1,
                      "id": "2528732444",
                      "realWidth": 1920,
                      "realHeight": 1080,
                      "workAreaWidth": 1920,
                      "workAreaHeight": 1032,
                      "rectWorkAreaWidth": 1920,
                      "rectWorkAreaHeight": 1032,
                      "rectWorkAreaRealWidth": 1920,
                      "rectWorkAreaRealHeight": 1032,
                      "rectWorkAreaX": 0,
                      "rectWorkAreaY": 0,
                      "depthPerComponent": 8,
                      "workAreaRealWidth": 1920,
                      "workAreaRealHeight": 1032,
                      "isPrimaryScreen": true
                    }
                  ]
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/arrangeWindows": {
      "post": {
        "operationId": "arrangeBrowserWindowsLocal",
        "summary": "Sắp xếp cửa sổ thích ứng chỉ với một cú nhấp chuột",
        "deprecated": false,
        "description": "Sắp xếp cửa sổ của các profile trình duyệt đang chạy trên màn hình.\n\n- **Nơi thực thi**: client desktop của MoreLogin xử lý hoàn toàn việc này trên máy của bạn. **Không có phần hiện thực ở phía server**, nên không tồn tại điều kiện tiên quyết nào về tài khoản, nhóm hay trạng thái ngoài việc client đang mở profile, và không có gì được ghi lại trên cloud.\n- **Tác động**: chỉ giới hạn trong các tiến trình và cửa sổ trình duyệt cục bộ. Dữ liệu profile, dấu vân tay và cache trên cloud đều không bị ảnh hưởng.\n- **Hoàn tất**: đồng bộ — client trả lời ngay khi đã thực hiện.\n- **Khả dụng**: chỉ Local API. Open API không có endpoint tương đương, vì nó không có trình duyệt cục bộ nào để tác động. Hãy dùng các endpoint runtime trên cloud thay thế.\n- **Lưu ý**: vì client là bên nắm giữ chức năng này, hình dạng phản hồi phụ thuộc vào phiên bản client đã cài chứ không phải vào một hợp đồng dịch vụ.",
        "tags": [
          "Cache & Window"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "arrangeType": {
                    "description": "Kiểu sắp xếp: 1 cho kiểu lát gạch, 2 cho kiểu xếp chồng, mặc định là kiểu lát gạch nếu không được chỉ định.",
                    "type": "integer"
                  },
                  "envIds": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Nếu không được chỉ định, ID môi trường sẽ được chọn mặc định cho tất cả các cửa sổ môi trường."
                  },
                  "screenIds": {
                    "type": "array",
                    "items": {
                      "type": "integer"
                    },
                    "description": "ID màn hình, kiểu mảng, nếu không được chỉ định, sẽ được sắp xếp trên màn hình tại vị trí con trỏ chuột."
                  }
                }
              },
              "example": {
                "arrangeType": 1,
                "envIds": [
                  "string"
                ],
                "screenIds": [
                  1
                ]
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Phong bì phản hồi chuẩn. Kết quả được báo qua `code`; thao tác này không định nghĩa payload bổ sung.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Thông báo lỗi; null khi thành công"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Định danh yêu cầu duy nhất; hãy cung cấp khi liên hệ hỗ trợ"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/setGroup/batch": {
      "post": {
        "operationId": "setBrowserGroupsBatchLocal",
        "summary": "Chỉnh sửa hàng loạt nhóm hồ sơ",
        "deprecated": false,
        "description": "Chuyển các profile trình duyệt vào một nhóm theo tên nhóm.\n- **Điều kiện tiên quyết**: cung cấp ít nhất một trong `envIds` hoặc `uniqueIds`; `groupName` là bắt buộc và tối đa 50 ký tự. Không có cách nào bỏ nhóm của một profile qua endpoint này.\n- **Tác động**: nhóm được tạo tự động khi tên chưa tồn tại, điều này **tính vào giới hạn 1000 nhóm mỗi nhóm làm việc** và sẽ thất bại khi đạt giới hạn đó. Một profile chỉ thuộc đúng một nhóm, nên nhóm trước đó sẽ bị thay thế. Khi nhóm làm việc của bạn phân quyền theo từng nhóm, nhóm được tạo ở đây cũng được cấp quyền cho bạn.\n- **Hoàn tất**: đồng bộ. Việc tạo nhóm được xếp tuần tự theo từng nhóm làm việc, nên các lệnh gọi đồng thời với cùng một tên mới sẽ không tạo ra bản trùng lặp.",
        "tags": [
          "Profiles"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "envIds": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "description": "Mã định danh môi trường, kiểu mảng, phải chọn một trong hai loại này hoặc mã định danh nối tiếp."
                    }
                  },
                  "groupName": {
                    "description": "Tên nhóm, kiểu chuỗi, bắt buộc",
                    "type": "string"
                  },
                  "uniqueIds": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Mã định danh nối tiếp, kiểu mảng, phải chọn một trong hai loại này và mã định danh môi trường."
                  }
                },
                "required": [
                  "groupName"
                ]
              },
              "example": {
                "groupName": "example-name"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là một giá trị boolean duy nhất.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "a416bb98f6d240c3bb79e7b2cf6e7ad4"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/setProxy/batch": {
      "post": {
        "operationId": "setBrowserProxiesBatchLocal",
        "summary": "Sửa đổi hàng loạt cấu hình proxy",
        "deprecated": false,
        "description": "Gán proxy cho nhiều profile trình duyệt.\n- **Điều kiện tiên quyết**: cung cấp ít nhất một trong `envIds` hoặc `uniqueIds`. Nếu bạn truyền `proxyId`, nó phải đã tồn tại trong nhóm, nếu không lệnh gọi bị từ chối chứ không tự tạo proxy mới.\n- **Tác động**: ghi `proxyId` lên từng profile. Khi `proxyId` được bỏ trống hoặc bằng `0`, một proxy hiện có với thông tin kết nối giống hệt sẽ được dùng lại, và nếu không có proxy nào khớp thì **một bản ghi proxy mới được tạo trong nhóm của bên gọi**.\n- **Hoàn tất**: đồng bộ. Các trình duyệt đang chạy vẫn giữ proxy mà chúng đã khởi động cùng.\n- **Thử lại**: gán lại cùng một `proxyId` là idempotent, nhưng gọi lại một yêu cầu mang thông tin kết nối thô có thể tạo thêm một bản ghi proxy mỗi lần cơ chế chống trùng không khớp được.\n\nCác mã lỗi nghiệp vụ đã ghi nhận: `19106`, `19193`, `14023`. Xem [Error Codes](../Getting%20Started/error-codes.md) để biết ý nghĩa từng mã. Mọi thao tác cũng có thể trả về các mã dùng chung.",
        "tags": [
          "Profiles"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "envIds": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Chọn một mục có mã số seri, phải điền vào mục đó."
                  },
                  "proxy": {
                    "type": "object",
                    "properties": {
                      "city": {
                        "type": "string",
                        "description": "Thành phố"
                      },
                      "state": {
                        "type": "string",
                        "description": "Tiểu bang/Tỉnh"
                      },
                      "country": {
                        "type": "string",
                        "description": "Quốc gia (mã quốc gia cụ thể, xem phụ lục). Bắt buộc khi proxyProvider là 16/17/18"
                      },
                      "encryptionType": {
                        "type": "integer",
                        "description": "Phương thức mã hóa. Không được để trống khi proxyProvider là 11. 1: aes-128-gcm, 2: aes-192-gcm, 3: aes-256-gcm, 4: aes-128-cfb, 5: aes-192-cfb, 6: aes-256-cfb, 7: aes-128-ctr, 8: aes-192-ctr, 9: aes-256-ctr, 10: rc4-md5, 11: chacha20-ietf, 12: xchacha20, 13: chacha20-ietf-poly1305, 14: xchacha20-ietf-poly1305"
                      },
                      "proxyId": {
                        "type": "string",
                        "description": "ID ủy quyền"
                      },
                      "proxyIp": {
                        "description": "Địa chỉ IP proxy. Có thể để trống khi proxyProvider là 16/17/18; bắt buộc đối với các trường hợp khác.",
                        "type": "string"
                      },
                      "proxyPort": {
                        "type": "integer",
                        "description": "Cổng proxy (chỉ cho phép các số từ 1-65535). Có thể để trống khi proxyProvider là 16/17/18; bắt buộc đối với các trường hợp khác."
                      },
                      "proxyType": {
                        "type": "integer",
                        "description": "Loại proxy, 0: http, 1: https. Không được để trống khi proxyProvider là 7/8"
                      },
                      "proxyProvider": {
                        "type": "string",
                        "description": "Loại proxy 0: http, 1: https, 2: socks5, 3: ssh, 4: Oxylabs, 5: Proxys.io, 7: Luminati, 8: Lumauto, 9: Oxylabsauto, 10: Trojan, 11: Shadowsocks, 13: ABCPROXY, 14: LunaProxy, 15: IPHTML, 16: PiaProxy, 17: 922S5, 18: 360Proxy"
                      },
                      "proxyName": {
                        "type": "string",
                        "description": "Tên máy chủ proxy (tối đa 600 ký tự)"
                      },
                      "password": {
                        "type": "string",
                        "description": "Mật khẩu (tối đa 100 ký tự)"
                      },
                      "refreshUrl": {
                        "type": "string",
                        "description": "Làm mới URL"
                      },
                      "ipMonitor": {
                        "type": "boolean",
                        "description": "Cho phép theo dõi thay đổi địa chỉ IP? true: Bật, false: Tắt"
                      },
                      "ipChangeAction": {
                        "type": "integer",
                        "description": "Giám sát thay đổi địa chỉ IP: 0: Chặn truy cập, 1: Cảnh báo"
                      },
                      "username": {
                        "type": "string",
                        "description": "Tên người dùng (tối đa 200 ký tự)"
                      }
                    },
                    "required": [
                      "city",
                      "country",
                      "encryptionType",
                      "ipChangeAction",
                      "ipMonitor",
                      "password",
                      "proxyId",
                      "proxyIp",
                      "proxyName",
                      "proxyPort",
                      "proxyProvider",
                      "proxyType",
                      "refreshUrl",
                      "state",
                      "username"
                    ],
                    "description": "Công cụ này dùng để thay đổi proxy được liên kết cho các môi trường. Nếu proxyId được cung cấp, hãy liên kết với proxy được đại diện bởi ID đó; nếu không, hãy liên kết với một proxy mới được thêm vào. Nếu thông tin proxy không thay đổi, quá trình liên kết lại sẽ không diễn ra (bất kỳ thay đổi nào trong proxyIp, proxyPort, proxyType hoặc proxyProvider đều được coi là một proxy mới và quá trình liên kết lại sẽ thành công)."
                  },
                  "uniqueIds": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Chọn một tùy chọn có ID môi trường, phải điền vào một tùy chọn."
                  }
                },
                "required": [
                  "proxy"
                ]
              },
              "example": {
                "proxy": {
                  "city": "string",
                  "country": "string",
                  "encryptionType": 1,
                  "ipChangeAction": 1,
                  "ipMonitor": true,
                  "password": "string",
                  "proxyId": "1661515884160372",
                  "proxyIp": "string",
                  "proxyName": "example-name",
                  "proxyPort": 1,
                  "proxyProvider": "string",
                  "proxyType": 1,
                  "refreshUrl": "https://example.com/resource",
                  "state": "string",
                  "username": "example-name"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là một giá trị boolean duy nhất.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "d57cfecfc6904fcaa57da9f65b2a15fd"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/setRemark/batch": {
      "post": {
        "operationId": "setBrowserRemarksBatchLocal",
        "summary": "Chỉnh sửa hàng loạt hồ sơ nhận xét",
        "deprecated": false,
        "description": "Đặt ghi chú cho nhiều profile trình duyệt. Chuỗi rỗng sẽ xóa ghi chú.\n- **Điều kiện tiên quyết**: cung cấp ít nhất một trong `envIds` hoặc `uniqueIds`; bên gọi phải có quyền với từng profile.\n- **Tác động**: chỉ ghi trường ghi chú.\n- **Hoàn tất**: đồng bộ. Hoàn toàn idempotent với cùng một request body.",
        "tags": [
          "Profiles"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "envIds": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Mã định danh môi trường, phải chọn một trong hai mã này hoặc mã định danh nối tiếp."
                  },
                  "envRemark": {
                    "description": "Lưu ý, bắt buộc",
                    "type": "string"
                  },
                  "uniqueIds": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Mã số sê-ri, phải chọn một trong hai mã này và mã môi trường."
                  }
                },
                "required": [
                  "envRemark"
                ]
              },
              "example": {
                "envRemark": "string"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là một giá trị boolean duy nhất.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "8172c8ff6ae048a9bb2546760832a460"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/closeAll": {
      "post": {
        "operationId": "closeAllBrowserProfilesLocal",
        "summary": "Đóng tất cả hồ sơ đang mở",
        "deprecated": false,
        "description": "Đóng mọi profile trình duyệt mà client này đang chạy.\n\n- **Nơi thực thi**: client desktop của MoreLogin xử lý hoàn toàn việc này trên máy của bạn. **Không có phần hiện thực ở phía server**, nên không tồn tại điều kiện tiên quyết nào về tài khoản, nhóm hay trạng thái ngoài việc client đang mở profile, và không có gì được ghi lại trên cloud.\n- **Tác động**: chỉ giới hạn trong các tiến trình và cửa sổ trình duyệt cục bộ. Dữ liệu profile, dấu vân tay và cache trên cloud đều không bị ảnh hưởng.\n- **Hoàn tất**: đồng bộ — client trả lời ngay khi đã thực hiện.\n- **Khả dụng**: chỉ Local API. Open API không có endpoint tương đương, vì nó không có trình duyệt cục bộ nào để tác động. Hãy dùng các endpoint runtime trên cloud thay thế.\n- **Lưu ý**: vì client là bên nắm giữ chức năng này, hình dạng phản hồi phụ thuộc vào phiên bản client đã cài chứ không phải vào một hợp đồng dịch vụ.",
        "tags": [
          "Runtime"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              },
              "example": {}
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Thành công. Thao tác này không trả về payload; kết quả được thể hiện qua `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Định danh yêu cầu duy nhất; hãy cung cấp khi liên hệ hỗ trợ"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": "Closed successfully"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/getAllProcessIds": {
      "post": {
        "operationId": "getAllBrowserProcessIdsLocal",
        "summary": "Lấy ID quy trình của tất cả các hồ sơ đang mở.",
        "deprecated": false,
        "description": "Liệt kê ID tiến trình của các profile trình duyệt đang chạy.\n\n- **Nơi thực thi**: client desktop của MoreLogin xử lý hoàn toàn việc này trên máy của bạn. **Không có phần hiện thực ở phía server**, nên không tồn tại điều kiện tiên quyết nào về tài khoản, nhóm hay trạng thái ngoài việc client đang mở profile, và không có gì được ghi lại trên cloud.\n- **Tác động**: chỉ giới hạn trong các tiến trình và cửa sổ trình duyệt cục bộ. Dữ liệu profile, dấu vân tay và cache trên cloud đều không bị ảnh hưởng.\n- **Hoàn tất**: đồng bộ — client trả lời ngay khi đã thực hiện.\n- **Khả dụng**: chỉ Local API. Open API không có endpoint tương đương, vì nó không có trình duyệt cục bộ nào để tác động. Hãy dùng các endpoint runtime trên cloud thay thế.\n- **Lưu ý**: vì client là bên nắm giữ chức năng này, hình dạng phản hồi phụ thuộc vào phiên bản client đã cài chứ không phải vào một hợp đồng dịch vụ.",
        "tags": [
          "Runtime"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              },
              "example": {}
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là mảng các đối tượng với các trường `envId`, `uniqueId`, `envName` và `pid`, và là mảng rỗng khi không có gì để trả về.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "envId": {
                            "type": "string",
                            "description": "ID Môi trường"
                          },
                          "uniqueId": {
                            "type": "integer",
                            "description": "Mã số thứ tự"
                          },
                          "envName": {
                            "type": "string",
                            "description": "Tên môi trường"
                          },
                          "pid": {
                            "type": "integer",
                            "description": "pid"
                          }
                        }
                      }
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Định danh yêu cầu duy nhất; hãy cung cấp khi liên hệ hỗ trợ"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    {
                      "envId": "2014664375044337664",
                      "uniqueId": 1788,
                      "envName": "P-1788",
                      "pid": 22460
                    }
                  ]
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/getAllDebugInfo": {
      "post": {
        "operationId": "getAllBrowserDebugInfoLocal",
        "summary": "Nhận thông tin gỡ lỗi từ xa cho tất cả các hồ sơ đã mở.",
        "deprecated": false,
        "description": "Liệt kê các endpoint gỡ lỗi của những profile trình duyệt đang chạy.\n\n- **Nơi thực thi**: client desktop của MoreLogin xử lý hoàn toàn việc này trên máy của bạn. **Không có phần hiện thực ở phía server**, nên không tồn tại điều kiện tiên quyết nào về tài khoản, nhóm hay trạng thái ngoài việc client đang mở profile, và không có gì được ghi lại trên cloud.\n- **Tác động**: chỉ giới hạn trong các tiến trình và cửa sổ trình duyệt cục bộ. Dữ liệu profile, dấu vân tay và cache trên cloud đều không bị ảnh hưởng.\n- **Hoàn tất**: đồng bộ — client trả lời ngay khi đã thực hiện.\n- **Khả dụng**: chỉ Local API. Open API không có endpoint tương đương, vì nó không có trình duyệt cục bộ nào để tác động. Hãy dùng các endpoint runtime trên cloud thay thế.\n- **Lưu ý**: vì client là bên nắm giữ chức năng này, hình dạng phản hồi phụ thuộc vào phiên bản client đã cài chứ không phải vào một hợp đồng dịch vụ.",
        "tags": [
          "Runtime"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              },
              "example": {}
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là mảng các đối tượng với các trường `envId`, `uniqueId`, `envName`, `debugPort`, `webdriver` và `pid`, và là mảng rỗng khi không có gì để trả về.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "envId": {
                            "type": "string",
                            "description": "ID Môi trường"
                          },
                          "uniqueId": {
                            "type": "integer",
                            "description": "Mã số thứ tự"
                          },
                          "envName": {
                            "type": "string",
                            "description": "Tên môi trường"
                          },
                          "debugPort": {
                            "type": "string",
                            "description": "Cổng gỡ lỗi"
                          },
                          "webdriver": {
                            "type": "string",
                            "description": "trình điều khiển web"
                          },
                          "pid": {
                            "type": "integer",
                            "description": "pid"
                          }
                        }
                      }
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Định danh yêu cầu duy nhất; hãy cung cấp khi liên hệ hỗ trợ"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    {
                      "envId": "2014664375044337664",
                      "uniqueId": 1788,
                      "envName": "P-1788",
                      "debugPort": "63536",
                      "webdriver": "C:\\Users\\EDY\\AppData\\Roaming\\MoreLogin\\env-kit\\Core\\chrome_64_142.9\\webdriver.exe",
                      "pid": 22460
                    }
                  ]
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/base/mobile/devices": {
      "post": {
        "operationId": "listMobileDeviceModelsLocal",
        "summary": "Lấy danh sách các mẫu điện thoại",
        "deprecated": false,
        "description": "Trả về các dòng thiết bị di động khả dụng cho profile trình duyệt Android và iOS.\n- **Tác động**: không có. Chỉ đọc. An toàn khi thử lại với thời gian chờ tăng dần có giới hạn.\n- **Nội dung**: phần giao giữa bảng thiết bị của MoreLogin và dịch vụ dữ liệu nền của dấu vân tay. Những dòng máy chỉ có ở một trong hai nguồn sẽ bị lược bỏ, và `id` trả về thuộc dịch vụ dấu vân tay, không phải bảng thiết bị.",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Thành công. `data` là mảng các đối tượng với các trường `id`, `name`, `resolution`, `os` và `platform`, và là mảng rỗng khi không có gì để trả về.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrowserPhoneList"
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    {
                      "id": "1673823102599682",
                      "name": "example-name",
                      "resolution": "string",
                      "os": 1,
                      "platform": "string"
                    }
                  ],
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/env/core/download": {
      "post": {
        "operationId": "downloadBrowserKernelsLocal",
        "summary": "Tải xuống nhân trình duyệt",
        "deprecated": false,
        "description": "Tải xuống và cài đặt nhân trình duyệt. Hỗ trợ tải xuống hàng loạt tối đa 20 nhân mỗi yêu cầu. Thời gian chờ cho thao tác này có thể lên đến khoảng 30 phút; bên gọi nên đặt thời gian chờ lớn hơn 1805 giây.\n\nYêu cầu phiên bản ứng dụng MoreLogin **2.61.1** trở lên.\n\n### Xử lý yêu cầu trùng lặp\n\n- Nếu cùng loại trình duyệt và phiên bản chính xuất hiện nhiều lần trong một yêu cầu, chỉ thực hiện một lần tra cứu và tải xuống, nhưng mỗi mục nhập đều có kết quả riêng.\n- Các yêu cầu đồng thời cho cùng phiên bản sẽ tham gia vào tác vụ đang thực hiện thay vì bắt đầu tải xuống mới.\n- Nếu phiên bản yêu cầu đã được cài đặt với phiên bản phụ mới nhất, trạng thái sẽ là `already_installed`.\n- Nếu phiên bản phụ cũ hơn đã được cài đặt, nó sẽ được cập nhật lên phiên bản phụ mới nhất có sẵn.\n\n### Tham chiếu mã lỗi\n\n| errorCode | Mô tả |\n|---|---|\n| `INVALID_JSON` | Nội dung JSON không đúng định dạng |\n| `INVALID_REQUEST` | Cấu trúc yêu cầu không hợp lệ |\n| `BATCH_LIMIT_EXCEEDED` | Mảng `Cores` vượt quá 20 mục |\n| `UNSUPPORTED_BROWSER_TYPE` | Loại trình duyệt không được hỗ trợ |\n| `INVALID_VERSION` | Định dạng phiên bản không hợp lệ |\n| `METADATA_LOOKUP_FAILED` | Không thể truy vấn metadata nhân |\n| `UNSUPPORTED_VERSION` | Phiên bản nhân không tồn tại hoặc không được hỗ trợ trên nền tảng này |\n| `CLIENT_NOT_READY` | Ứng dụng khách chưa sẵn sàng |\n| `SDK_NOT_READY` | SDK chưa khởi tạo |\n| `INSUFFICIENT_DISK_SPACE` | Không đủ dung lượng đĩa |\n| `DOWNLOAD_FAILED` | Tải xuống thất bại |\n| `CHECKSUM_MISMATCH` | Xác minh checksum MD5 thất bại |\n| `EXTRACTION_FAILED` | Giải nén hoặc cài đặt thất bại |\n| `TIMEOUT` | Hết thời gian thao tác |\n| `UNKNOWN` | Lỗi không xác định |\n",
        "tags": [
          "Runtime"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "Cores": {
                    "type": "array",
                    "description": "Danh sách nhân cần tải xuống (1–20 mục)",
                    "items": {
                      "type": "object",
                      "properties": {
                        "BrowserType": {
                          "type": "integer",
                          "description": "Loại trình duyệt. `1`:Chrome, `2`:Firefox"
                        },
                        "Version": {
                          "type": "string",
                          "description": "Số phiên bản chính của nhân, ví dụ `\"124\"`, `\"146\"`"
                        }
                      },
                      "required": [
                        "BrowserType",
                        "Version"
                      ]
                    }
                  }
                },
                "required": [
                  "Cores"
                ]
              },
              "example": {
                "Cores": [
                  {
                    "BrowserType": 1,
                    "Version": "124"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thành công. `data` là một đối tượng với các trường `total`, `succeeded`, `failed` và `results`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Mã phản hồi. `0`:tất cả thành công; `-1`:thành công một phần; `-2`:tất cả thất bại"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Thông báo lỗi cấp yêu cầu; thường là `null` khi thành công"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "total": {
                          "type": "integer",
                          "description": "Tổng số tác vụ yêu cầu"
                        },
                        "succeeded": {
                          "type": "integer",
                          "description": "Số tác vụ thành công (bao gồm đã cài đặt)"
                        },
                        "failed": {
                          "type": "integer",
                          "description": "Số tác vụ thất bại"
                        },
                        "results": {
                          "type": "array",
                          "description": "Kết quả thực thi cho mỗi mục nhập, theo cùng thứ tự với yêu cầu",
                          "items": {
                            "type": "object",
                            "properties": {
                              "index": {
                                "type": "integer",
                                "description": "Chỉ mục tương ứng trong mảng `Cores` (bắt đầu từ 0)"
                              },
                              "browserType": {
                                "type": [
                                  "integer",
                                  "null"
                                ],
                                "description": "Loại trình duyệt"
                              },
                              "requestedVersion": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Phiên bản chính đã yêu cầu"
                              },
                              "resolvedVersion": {
                                "type": "string",
                                "description": "Phiên bản đầy đủ thực tế đã giải quyết; được trả về khi thành công hoặc khi metadata đã giải quyết"
                              },
                              "status": {
                                "type": "string",
                                "description": "Trạng thái tác vụ:`installed`, `already_installed` hoặc `failed`"
                              },
                              "source": {
                                "type": "string",
                                "description": "Nguồn tải xuống:`downloaded`, `already_installed` hoặc `joined_in_flight`"
                              },
                              "errorCode": {
                                "type": "string",
                                "description": "Mã phân loại lỗi ổn định được trả về khi thất bại"
                              },
                              "serverCode": {
                                "type": "integer",
                                "description": "Tùy chọn. Mã lỗi nghiệp vụ gốc từ dịch vụ nền tảng"
                              },
                              "msg": {
                                "type": "string",
                                "description": "Thông báo hiển thị; có thể thay đổi theo ngôn ngữ ứng dụng. Không sử dụng để kiểm tra kết quả theo chương trình"
                              }
                            }
                          }
                        }
                      },
                      "required": [
                        "total",
                        "succeeded",
                        "failed",
                        "results"
                      ]
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Định danh yêu cầu duy nhất; hãy cung cấp khi liên hệ hỗ trợ"
                    }
                  },
                  "required": [
                    "code",
                    "data"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "total": 1,
                    "succeeded": 1,
                    "failed": 0,
                    "results": [
                      {
                        "index": 0,
                        "browserType": 1,
                        "requestedVersion": "124",
                        "resolvedVersion": "124.5",
                        "status": "installed",
                        "source": "downloaded",
                        "msg": "Download successful"
                      }
                    ]
                  }
                }
              }
            },
            "headers": {}
          }
        },
        "security": []
      }
    },
    "/api/cloudbrowser/start": {
      "post": {
        "summary": "Khởi động môi trường chạy đám mây",
        "description": "Khởi động một profile trình duyệt dưới dạng runtime trên cloud.\n- **Điều kiện tiên quyết**: profile phải tồn tại trong nhóm của bạn và không được mã hóa đầu-cuối hay đang trong quá trình chuyển giao. **Bắt buộc phải có proxy** và khả năng kết nối của nó được kiểm tra trước khi lệnh khởi động được tiếp nhận. Kernel trình duyệt phải là loại mà cloud browser hỗ trợ, điều này loại trừ Firefox. Giới hạn số phiên mở của nhóm được áp dụng, và trên các bản triển khai có bật tính phí cloud browser thì số dư credit AI cũng được kiểm tra.\n- **Một lượt chạy cho mỗi profile**: mỗi thành viên chỉ có thể có một lượt chạy đang hoạt động cho mỗi profile. Khi nhóm bật khóa bảo mật, lượt chạy của thành viên khác sẽ chặn lượt của bạn.\n- **Hoàn tất**: **đã tiếp nhận, chưa hoàn tất.** `data` rỗng; runtime được cấp phát không đồng bộ. Hãy hỏi vòng `/cloudbrowser/page` cho đến khi `cloudBrowserStatus` là `RUNNING`, rồi gọi `/cloudbrowser/connect` để lấy `cdpUrl`. Một lệnh khởi động có thể được tiếp nhận rồi vẫn thất bại về sau, và điều đó hiện ra ở trang này.\n- **Đồng thời**: các lệnh khởi động đồng thời cho cùng một profile được xếp tuần tự bằng khóa; bên thua bị từ chối chứ không xếp hàng đợi.\n- **Thử lại**: sau khi hết thời gian chờ, hãy đọc `/cloudbrowser/page` — đừng gửi lại.\n\nCác mã lỗi nghiệp vụ đã ghi nhận: `19039`, `19065`, `40001`, `40003`, `40015`, `40016`, `40021`, `40023`, `40024`, `40025`, `40026`, `40027`, `40028`, `40029`, `40037`. Xem [Error Codes](../Getting%20Started/error-codes.md) để biết ý nghĩa từng mã. Mọi thao tác cũng có thể trả về các mã dùng chung.",
        "operationId": "startCloudRuntimeLocal",
        "tags": [
          "Cloud Runtime"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserStartRequest"
              },
              "example": {
                "envId": "1800000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        },
        "security": []
      }
    },
    "/api/cloudbrowser/stop": {
      "post": {
        "summary": "Dừng môi trường chạy đám mây",
        "description": "Dừng runtime trên cloud mà một profile đang chạy trong đó.\n- **Điều kiện tiên quyết**: phải có một lần chạy đang hoạt động do bạn khởi động cho profile đó. Gọi khi runtime đã dừng hoặc đang được giải phóng sẽ trả về thành công mà không làm gì.\n- **Tác động**: dừng tính phí, chốt mức sử dụng, giải phóng khóa của profile, và yêu cầu client lưu trữ profile cùng cookie về cloud trước khi runtime được giải phóng.\n- **Hoàn tất**: **đã tiếp nhận, chưa hoàn tất.** Hãy hỏi vòng `/cloudbrowser/page` cho đến khi `cloudBrowserStatus` là `CLOSED` và `cloudBrowserArchiveStatus` đạt `COMPLETED` hoặc `FAILED`.\n- **Khi lưu trữ thất bại**: lần chạy vẫn bị tính phí và vẫn hiển thị là `RUNNING`. `force` **chỉ** có hiệu lực trong trạng thái đó: nó bỏ qua bước lưu trữ và giải phóng runtime, khiến các thay đổi profile của phiên này bị loại bỏ.\n- **Đồng thời**: các lệnh dừng đồng thời cho cùng một lần chạy được xếp tuần tự, nên gọi trùng là an toàn.\n\nCác mã lỗi nghiệp vụ đã ghi nhận: `40002`, `40006`, `40008`, `40020`. Xem [Error Codes](../Getting%20Started/error-codes.md) để biết ý nghĩa từng mã. Mọi thao tác cũng có thể trả về các mã dùng chung.",
        "operationId": "stopCloudRuntimeLocal",
        "tags": [
          "Cloud Runtime"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserStopRequest"
              },
              "example": {
                "envId": "1800000000000001",
                "force": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        },
        "security": []
      }
    },
    "/api/cloudbrowser/page": {
      "post": {
        "summary": "Danh sách môi trường chạy đám mây",
        "description": "Liệt kê các profile trình duyệt kèm trạng thái runtime trên cloud cho thành viên đang gọi.\n- **Tác động**: không có. Chỉ đọc. An toàn khi thử lại với thời gian chờ tăng dần có giới hạn.\n- **Giá trị trạng thái**: `cloudBrowserStatus` chỉ có thể là `STARTING`, `RUNNING` hoặc `CLOSED`. **`RUNNING` không có nghĩa là trình duyệt dùng được**: một runtime đang dừng, đang lưu trữ, hoặc dừng thất bại cũng được báo là `RUNNING`. `cloudBrowserArchiveStatus` (`PENDING`, `ARCHIVING`, `COMPLETED`, `FAILED`) giúp phân biệt hai trường hợp này và bằng null khi không có hoạt động nào.\n- **Tính nhất quán**: việc tra cứu runtime là tất-cả-hoặc-không-gì. Nếu không tra cứu được cho cả trang, lệnh gọi sẽ thất bại thay vì trả về dữ liệu một phần.",
        "operationId": "pageCloudRuntimesLocal",
        "tags": [
          "Cloud Runtime"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserPageRequest"
              },
              "example": {
                "pageNo": 1,
                "pageSize": 10,
                "keyword": "marketing"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudBrowserPageResponse"
          }
        },
        "security": []
      }
    },
    "/api/cloudbrowser/connect": {
      "post": {
        "summary": "Kết nối môi trường chạy đám mây",
        "description": "Trả về thông tin kết nối tới một runtime trên cloud đang chạy.\n- **Điều kiện tiên quyết**: runtime phải ở đúng trạng thái `RUNNING` và phải do chính bạn khởi động. Một runtime đang dừng hoặc đang lưu trữ sẽ bị từ chối, dù `/cloudbrowser/page` vẫn báo `RUNNING`.\n- **Tác động**: phát hành một token truy cập desktop mới và ghi nhận bạn là thành viên đang kết nối.\n- **Gọi lặp lại**: `cdpUrl` trả về là ổn định và các phiên CDP hiện có vẫn hoạt động, nhưng mỗi lần gọi lại phát hành một token desktop mới và ghi đè thành viên kết nối đã lưu. **Các URL desktop trước đó không bị thu hồi**, nên hãy coi mỗi URL trả về là một thông tin xác thực còn hiệu lực: không ghi vào log và không lưu trữ lại.\n- **Giới hạn phiên**: runtime tự động dừng khi đạt thời lượng tối đa, và quá trình lưu trữ bắt đầu ngay trước đó, nên một tiến trình tự động hóa chạy dài phải xử lý được việc runtime biến mất.\n- **Dùng để**: kết nối Puppeteer, Playwright hoặc Selenium tới `cdpUrl`.\n\nCác mã lỗi nghiệp vụ đã ghi nhận: `40008`, `40009`, `40010`. Xem [Error Codes](../Getting%20Started/error-codes.md) để biết ý nghĩa từng mã. Mọi thao tác cũng có thể trả về các mã dùng chung.",
        "operationId": "connectCloudRuntimeLocal",
        "tags": [
          "Cloud Runtime"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserConnectRequest"
              },
              "example": {
                "envId": "1800000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudBrowserConnectResponse"
          }
        },
        "security": []
      }
    }
  },
  "components": {
    "schemas": {
      "CreateEnvironmentRequest": {
        "allOf": [
          {
            "$ref": "#/components/schemas/EnvironmentBase"
          },
          {
            "type": "object",
            "required": [
              "browserTypeId",
              "operatorSystemId"
            ],
            "properties": {
              "proxy": {
                "type": "object",
                "properties": {
                  "proxyId": {
                    "description": "ID proxy",
                    "type": "string"
                  },
                  "proxyName": {
                    "description": "Tên proxy (tối đa 600 ký tự)",
                    "type": "string"
                  },
                  "proxyType": {
                    "description": "Kiểu proxy, 0: http, 1: https. Không được để trống khi proxyProvider là 7/8",
                    "type": "integer"
                  },
                  "proxyProvider": {
                    "description": "Loại proxy 0: http, 1: https, 2: socks5, 3: ssh, 4: Oxylabs, 5: Proxys.io, 7: Luminati, 8: Lumauto, 9: Oxylabsauto, 10: Trojan, 11: Shadowsocks, 13: ABCPROXY, 14: LunaProxy, 15: IPHTML, 16: PiaProxy, 17: 922S5, 18: 360Proxy",
                    "type": "string"
                  },
                  "proxyIp": {
                    "description": "IP proxy. Có thể để trống khi proxyProvider là 16/17/18; bắt buộc với các trường hợp còn lại",
                    "type": "string"
                  },
                  "proxyPort": {
                    "description": "Cổng proxy (chỉ nhận số từ 1 đến 65535). Có thể để trống khi proxyProvider là 16/17/18; bắt buộc với các trường hợp còn lại",
                    "type": "integer"
                  },
                  "username": {
                    "description": "Tên người dùng (tối đa 200 ký tự)",
                    "type": "string"
                  },
                  "password": {
                    "description": "Mật khẩu (tối đa 100 ký tự)",
                    "type": "string"
                  },
                  "refreshUrl": {
                    "description": "URL làm mới",
                    "type": "string"
                  },
                  "country": {
                    "description": "Mã quốc gia (ví dụ `us`). Xem [bảng quốc gia và múi giờ](/api-reference/appendix/country-time-zone) để biết các mã được hỗ trợ. Bắt buộc khi proxyProvider là 16/17/18",
                    "type": "string"
                  },
                  "city": {
                    "description": "Thành phố",
                    "type": "string"
                  },
                  "state": {
                    "description": "Tỉnh/Thành",
                    "type": "string"
                  },
                  "encryptionType": {
                    "description": "Phương thức mã hóa. Không được để trống khi proxyProvider là 11. 1: aes-128-gcm, 2: aes-192-gcm, 3: aes-256-gcm, 4: aes-128-cfb, 5: aes-192-cfb, 6: aes-256-cfb, 7: aes-128-ctr, 8: aes-192-ctr, 9: aes-256-ctr, 10: rc4-md5, 11: chacha20-ietf, 12: xchacha20, 13: chacha20-ietf-poly1305, 14: xchacha20-ietf-poly1305",
                    "type": "integer"
                  },
                  "ipMonitor": {
                    "description": "Bật theo dõi thay đổi IP? true: bật, false: tắt",
                    "type": "boolean"
                  },
                  "ipChangeAction": {
                    "description": "Theo dõi thay đổi IP 0: chặn truy cập, 1: cảnh báo",
                    "type": "integer"
                  }
                },
                "description": "Thông tin proxy"
              }
            }
          }
        ]
      },
      "UpdateEnvironmentRequest": {
        "allOf": [
          {
            "$ref": "#/components/schemas/EnvironmentBase"
          },
          {
            "type": "object",
            "required": [
              "envId"
            ],
            "properties": {
              "envId": {
                "type": "string",
                "description": "ID môi trường"
              }
            }
          }
        ]
      },
      "EnvironmentBase": {
        "type": "object",
        "properties": {
          "browserTypeId": {
            "type": "integer",
            "description": "ID loại trình duyệt; 1=Chrome, 2=Firefox"
          },
          "operatorSystemId": {
            "type": "integer",
            "description": "ID loại hệ điều hành; 1:Windows 2:macOS 3:Android 4:IOS 5:Linux"
          },
          "isEncrypt": {
            "type": "integer",
            "description": "Có mã hóa profile hay không; 0=Không, 1=Có"
          },
          "startupParams": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Tham số khởi động trình duyệt bổ sung"
          },
          "accountInfo": {
            "description": "Thông tin tài khoản",
            "$ref": "#/components/schemas/AccountInfo"
          },
          "advancedSetting": {
            "description": "Thiết lập dấu vân tay nâng cao của trình duyệt",
            "$ref": "#/components/schemas/AdvancedSetting"
          },
          "afterStartupConfig": {
            "description": "Cấu hình sau khi khởi động",
            "$ref": "#/components/schemas/AfterStartupConfig"
          },
          "browserCore": {
            "type": "integer",
            "description": "Phiên bản kernel; mặc định: 0 (tự động khớp). Lấy các phiên bản khả dụng qua `/api/env/advanced/ua/versions`."
          },
          "cookies": {
            "type": "string",
            "description": "Chuỗi cookie nạp trước (không bắt buộc)"
          },
          "envName": {
            "type": "string",
            "description": "Tên môi trường"
          },
          "envRemark": {
            "type": "string",
            "description": "Ghi chú môi trường; độ dài tối đa: 1500 ký tự"
          },
          "groupId": {
            "type": "string",
            "description": "ID nhóm môi trường; mặc định: chưa thuộc nhóm (0)"
          },
          "groupName": {
            "type": "string",
            "maxLength": 50,
            "description": "Tên nhóm (tối đa 50 ký tự). Nếu được cung cấp, hệ thống sẽ kiểm tra groupId trước: nếu tìm thấy nhóm hợp lệ thì sử dụng nhóm đó; nếu không, tìm kiếm theo groupName. Nếu nhóm có tên đó tồn tại thì tham chiếu nhóm đó; nếu không thì tạo nhóm mới. Mỗi đội bị giới hạn 1.000 nhóm."
          },
          "proxyId": {
            "type": "string",
            "description": "ID proxy; mặc định: 0"
          },
          "tagIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "ID các thẻ; mặc định: không có"
          },
          "uaVersion": {
            "type": "integer",
            "description": "Phiên bản UA đặt trước; mặc định: 0 (tất cả)"
          },
          "disableAudio": {
            "type": "integer",
            "description": "Tắt âm thanh: 0 = không, 1 = có"
          },
          "disableImg": {
            "type": "integer",
            "description": "Tắt tải hình ảnh: 0 = không, 1 = có"
          },
          "disableVideo": {
            "type": "integer",
            "description": "Tắt tải video: 0 = không, 1 = có"
          },
          "imgLimitSize": {
            "type": "integer",
            "description": "Kích thước ảnh tối đa (KB)"
          }
        }
      },
      "AccountInfo": {
        "type": "object",
        "properties": {
          "customerUrl": {
            "type": "string",
            "description": "URL nền tảng tùy chỉnh — bắt buộc nếu platformId=9999, phải là một URL hợp lệ."
          },
          "password": {
            "type": "string",
            "description": "Mật khẩu; độ dài tối đa: 50 ký tự"
          },
          "platformId": {
            "type": "string",
            "description": "Mã định danh nền tảng; sử dụng 9999 cho URL tùy chỉnh. Tham khảo /api/system/platform/list."
          },
          "siteId": {
            "type": "string",
            "description": "Mã định danh trang web; lấy thông qua API \"Lấy các nền tảng có thể cấu hình\" (/api/system/platform/list)"
          },
          "username": {
            "type": "string",
            "maxLength": 64,
            "description": "Tên người dùng; độ dài tối đa: 64 ký tự"
          }
        }
      },
      "AdvancedSetting": {
        "type": "object",
        "description": "Cấu hình nâng cao về dấu vân tay và hành vi trình duyệt.",
        "properties": {
          "ua": {
            "type": "string",
            "description": "Tùy chỉnh thông tin User-Agent (UA) của hồ sơ. Phải tuân theo định dạng UA chuẩn.\n\nCó thể thực hiện thông qua API “Get Browser UA”.\n"
          },
          "time_zone": {
            "description": "Thiết lập múi giờ",
            "$ref": "#/components/schemas/TimeZoneConfig"
          },
          "web_rtc": {
            "description": "Thiết lập WebRTC",
            "$ref": "#/components/schemas/WebRTCConfig"
          },
          "geo_location": {
            "description": "Thiết lập vị trí địa lý",
            "$ref": "#/components/schemas/GeoLocationConfig"
          },
          "language": {
            "description": "Ngôn ngữ",
            "$ref": "#/components/schemas/LanguageConfig"
          },
          "resolution": {
            "description": "Thiết lập độ phân giải",
            "$ref": "#/components/schemas/ResolutionConfig"
          },
          "font": {
            "description": "Thiết lập phông chữ",
            "$ref": "#/components/schemas/FontConfig"
          },
          "canvas": {
            "description": "Thiết lập dấu vân tay Canvas",
            "$ref": "#/components/schemas/CanvasConfig"
          },
          "webgl_image": {
            "description": "Thiết lập ảnh WebGL",
            "$ref": "#/components/schemas/WebGLImageConfig"
          },
          "webgl_metadata": {
            "description": "Thiết lập metadata WebGL",
            "$ref": "#/components/schemas/WebGLMetadataConfig"
          },
          "audio_context": {
            "description": "AudioContext: 1 = thêm nhiễu, 2 = giá trị thật",
            "$ref": "#/components/schemas/AudioContextConfig"
          },
          "media_device": {
            "description": "Thiết bị đa phương tiện: 1 = thêm nhiễu, 2 = giá trị thật",
            "$ref": "#/components/schemas/MediaDeviceConfig"
          },
          "client_rects": {
            "description": "ClientRects: 1 = thêm nhiễu, 2 = giá trị thật",
            "$ref": "#/components/schemas/ClientRectsConfig"
          },
          "speech_voise": {
            "description": "Giọng đọc: 1 = bảo mật, 2 = giá trị thật",
            "$ref": "#/components/schemas/SpeechVoiseConfig"
          },
          "hardware_concurrency": {
            "type": "integer",
            "description": "Số lõi CPU logic được mô phỏng.\n\nMặc định: 4. Tùy chọn: 0 (thực), 2, 3, 4, 6, 8, 10, 12.\n"
          },
          "memery_device": {
            "type": "integer",
            "description": "Bộ nhớ thiết bị mô phỏng (GB).\n\nMặc định: 8. Tùy chọn: 0 (thực), 2, 4, 6, 8.\n"
          },
          "do_not_track": {
            "type": "integer",
            "description": "Chế độ \"Không theo dõi\". Mặc định: 2. 1 = bật, 2 = tắt."
          },
          "bluetooth": {
            "description": "Bluetooth: 1 = bảo mật, 2 = giá trị thật",
            "$ref": "#/components/schemas/BluetoothConfig"
          },
          "battery": {
            "description": "Pin: 1 = bảo mật, 2 = giá trị thật",
            "$ref": "#/components/schemas/BatteryConfig"
          },
          "port_scan_protection": {
            "description": "Bảo vệ chống quét cổng",
            "$ref": "#/components/schemas/PortScanProtectionConfig"
          },
          "os_version": {
            "type": "string",
            "description": "Phiên bản hệ điều hành macOS (ví dụ: macOS 12, macOS 13, macOS 14)."
          },
          "web_gpu": {
            "description": "Thiết lập WebGPU",
            "$ref": "#/components/schemas/WebGPUConfig"
          },
          "ciphers": {
            "description": "Cấu hình bộ mã hóa",
            "$ref": "#/components/schemas/CiphersConfig"
          },
          "mobile_device": {
            "type": "string",
            "description": "Mã định danh kiểu điện thoại (dưới dạng chuỗi). Lấy thông qua API \"Lấy danh sách kiểu điện thoại\".\n\nVí dụ: \"1826502391344832512\"\n"
          }
        }
      },
      "TimeZoneConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Tùy chọn múi giờ. Mặc định: 1. 1 = Khớp địa chỉ IP, 2 = Tùy chỉnh."
          },
          "value": {
            "type": "string",
            "description": "Bắt buộc khi switcher=2.\n\nID múi giờ từ API “Lấy danh sách múi giờ và ngôn ngữ”.\n"
          }
        }
      },
      "WebRTCConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách WebRTC. Mặc định: 2. 1 = Bảo mật, 2 = Thay thế, 3 = Thực, 4 = Vô hiệu hóa, 5 = Chuyển tiếp.\n"
          }
        }
      },
      "GeoLocationConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách định vị địa lý. Mặc định: 1. 1 = Yêu cầu xác nhận, 2 = Vô hiệu hóa."
          },
          "base_on_ip": {
            "type": "boolean",
            "description": "Tạo vị trí dựa trên địa chỉ IP? Mặc định: true. true = yêu cầu xác nhận, false = xác nhận thủ công."
          },
          "latitude": {
            "type": "number",
            "format": "float",
            "description": "Vĩ độ. Bắt buộc nếu base_on_ip=false."
          },
          "longitude": {
            "type": "number",
            "format": "float",
            "description": "Kinh độ. Bắt buộc nếu base_on_ip=false."
          },
          "accuracy": {
            "type": "number",
            "format": "float",
            "description": "Độ chính xác tính bằng mét. Bắt buộc nếu base_on_ip=false."
          }
        }
      },
      "LanguageConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách ngôn ngữ. Mặc định: 1. 1 = Khớp IP, 2 = Tùy chỉnh."
          },
          "value": {
            "type": "string",
            "description": "Bắt buộc khi switcher=2.\n\nID ngôn ngữ được phân tách bằng dấu phẩy từ API “Lấy danh sách múi giờ và ngôn ngữ”.\n"
          }
        }
      },
      "ResolutionConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách độ phân giải. Mặc định: 1. 1 = Thực tế, 2 = Tùy chỉnh."
          },
          "id": {
            "type": "string",
            "description": "Bắt buộc khi switcher=2.\n\nID độ phân giải từ API “Lấy danh sách độ phân giải”.\n"
          }
        }
      },
      "FontConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách phông chữ. Mặc định: 1. 1 = Phông chữ thật, 2 = Phông chữ tùy chỉnh."
          },
          "value": {
            "type": "string",
            "description": "Tên phông chữ tùy chỉnh được phân tách bằng dấu phẩy (bắt buộc nếu switcher=2)."
          }
        }
      },
      "CanvasConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách Canvas. Mặc định: 1. 1 = Nhiễu, 2 = Thực."
          }
        }
      },
      "WebGLImageConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách hình ảnh WebGL. Mặc định: 1. 1 = Nhiễu, 2 = Thực."
          }
        }
      },
      "WebGLMetadataConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách siêu dữ liệu WebGL. Mặc định: 3. 1 = Thực, 2 = Tắt tăng tốc phần cứng, 3 = Tùy chỉnh."
          },
          "provider": {
            "type": "string",
            "description": "Chuỗi dịch vụ thiết bị WebGL (ví dụ: \"Google Inc.\")"
          },
          "render": {
            "type": "string",
            "description": "Chuỗi hiển thị WebGL (ví dụ: \"ANGLE (...)\")"
          }
        }
      },
      "AudioContextConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách AudioContext. Mặc định: 1. 1 = Tiếng ồn, 2 = Chân thực."
          }
        }
      },
      "MediaDeviceConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách thiết bị đa phương tiện. Mặc định: 1. 1 = Nhiễu, 2 = Thực."
          }
        }
      },
      "ClientRectsConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách ClientRects. Mặc định: 1. 1 = Nhiễu, 2 = Thực."
          }
        }
      },
      "SpeechVoiseConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách SpeechVoices. Mặc định: 1. 1 = Riêng tư, 2 = Thực tế"
          }
        }
      },
      "BluetoothConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách Bluetooth. Mặc định: 1. 1 = Quyền riêng tư, 2 = Xác thực."
          }
        }
      },
      "BatteryConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách pin. Mặc định: 1. 1 = Quyền riêng tư, 2 = Tính xác thực."
          }
        }
      },
      "PortScanProtectionConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Bảo vệ chống quét cổng. Mặc định: 1. 1 = Bật, 2 = Tắt."
          },
          "value": {
            "type": "string",
            "description": "Các cổng mạng cục bộ được phép kết nối (phân cách bằng dấu phẩy)."
          }
        }
      },
      "WebGPUConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách WebGPU. Mặc định: 1. 1 = khớp dựa trên WebGL, 2 = đúng, 3 = tắt."
          }
        }
      },
      "AfterStartupConfig": {
        "type": "object",
        "properties": {
          "afterStartup": {
            "type": "integer",
            "format": "int32",
            "description": "Hành động sau khi khởi động. Mặc định: 1.\n\n1 = Tiếp tục trang trước,\n2 = Mở URL được chỉ định,\n3 = Mở URL + nền tảng,\n4 = Tiếp tục trang trước + nền tảng.\n"
          },
          "autoOpenUrls": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri"
            },
            "description": "Danh sách các URL hợp lệ cần tự động mở (bắt buộc đối với tùy chọn 2–3)."
          }
        }
      },
      "CiphersConfig": {
        "type": "object",
        "properties": {
          "switcher": {
            "type": "integer",
            "description": "Chính sách mã hóa TLS. Mặc định: 1. 1 = Mặc định, 2 = Tùy chỉnh."
          },
          "value": {
            "type": "string",
            "description": "Bắt buộc khi switcher=2.\n\nDanh sách các giao thức TLS cần vô hiệu hóa, được phân tách bằng dấu phẩy (ví dụ: \"TLSv1,TLSv1.1\").\n"
          }
        }
      },
      "BrowserPhoneList": {
        "type": "object",
        "properties": {
          "code": {
            "description": "Mã trả về 0: Bình thường. Các mã khác là ngoại lệ.",
            "type": "integer"
          },
          "msg": {
            "description": "Thông báo lỗi",
            "type": [
              "string",
              "null"
            ]
          },
          "data": {
            "description": "Dữ liệu phản hồi",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "resolution": {
                  "type": "string"
                },
                "os": {
                  "type": "integer"
                },
                "platform": {
                  "type": "string"
                }
              }
            }
          },
          "requestId": {
            "description": "ID yêu cầu hoạt động",
            "type": "string"
          }
        },
        "required": [
          "code",
          "msg",
          "data",
          "requestId"
        ]
      },
      "EnvironmentId": {
        "type": "string",
        "pattern": "^[1-9]\\d*$",
        "description": "Browser profile (environment) ID. Serialized as a decimal string to avoid JavaScript\nprecision loss on 64-bit integers.\n",
        "example": "1800000000000001"
      },
      "CloudBrowserStartRequest": {
        "type": "object",
        "properties": {
          "envId": {
            "$ref": "#/components/schemas/EnvironmentId"
          }
        },
        "required": [
          "envId"
        ]
      },
      "ApiResponseBase": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Return result code. `0` means success; other codes indicate exceptions.",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Error message. Usually `null` on success.",
            "example": null
          },
          "requestId": {
            "type": "string",
            "description": "Operation request ID. This field may be present when the request passes through the API gateway.",
            "example": "1d4f3ea968664593860b94b35d4ebf5e"
          }
        },
        "required": [
          "code",
          "msg"
        ]
      },
      "CloudBrowserStopRequest": {
        "type": "object",
        "properties": {
          "envId": {
            "$ref": "#/components/schemas/EnvironmentId"
          },
          "force": {
            "type": "boolean",
            "description": "Whether to forcibly release the cloud runtime. Only takes effect when the current run has\nan archive status of `FAILED`; in that case the archive step is skipped and runtime\nresources are reclaimed. Ignored in all other cases.\n",
            "default": false,
            "example": false
          }
        },
        "required": [
          "envId"
        ]
      },
      "CloudBrowserPageRequest": {
        "type": "object",
        "properties": {
          "uniqueIds": {
            "type": "array",
            "description": "Environment sequence numbers. Up to 100 items.",
            "maxItems": 100,
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "example": [
              1001,
              1002
            ]
          },
          "envId": {
            "allOf": [
              {
                "$ref": "#/components/schemas/EnvironmentId"
              }
            ],
            "description": "Environment ID. The request also accepts the field alias `id`."
          },
          "envName": {
            "type": "string",
            "description": "Environment name.",
            "example": "marketing-01"
          },
          "keyword": {
            "type": "string",
            "description": "Keyword filter. Matches environment name, group name, tag name, and remark.",
            "example": "marketing"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Group ID. `0` means ungrouped.",
            "example": "0"
          },
          "pageNo": {
            "type": "integer",
            "format": "int64",
            "description": "Current page number, starting from 1. Default is 1.",
            "minimum": 1,
            "default": 1,
            "example": 1
          },
          "pageSize": {
            "type": "integer",
            "format": "int64",
            "description": "Number of items per page. Default is 10, maximum 100.",
            "minimum": 1,
            "maximum": 100,
            "default": 10,
            "example": 10
          }
        },
        "required": [
          "pageNo",
          "pageSize"
        ]
      },
      "CloudBrowserStatus": {
        "type": "string",
        "description": "Cloud runtime status:\n- `STARTING` — starting up\n- `RUNNING` — running and ready to connect\n- `CLOSED` — not started, closed, or failed to start\n",
        "enum": [
          "STARTING",
          "RUNNING",
          "CLOSED"
        ],
        "example": "RUNNING"
      },
      "CloudBrowserArchiveStatus": {
        "type": [
          "string",
          "null"
        ],
        "description": "Archive status of the current cloud run. `null` when there is no active run record:\n- `PENDING` — pending archive\n- `ARCHIVING` — archiving\n- `COMPLETED` — archive completed\n- `FAILED` — archive failed\n",
        "enum": [
          "PENDING",
          "ARCHIVING",
          "COMPLETED",
          "FAILED",
          null
        ],
        "example": null
      },
      "CloudBrowserPageItem": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/EnvironmentId"
          },
          "envName": {
            "type": "string",
            "description": "Environment name.",
            "example": "marketing-01"
          },
          "proxyId": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d+$",
            "description": "Proxy ID currently bound to the profile. `null` when no proxy is configured.",
            "example": "1800000000000101"
          },
          "cloudBrowserStatus": {
            "$ref": "#/components/schemas/CloudBrowserStatus"
          },
          "cloudBrowserArchiveStatus": {
            "$ref": "#/components/schemas/CloudBrowserArchiveStatus"
          },
          "startDate": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",
            "description": "Cloud runtime start time. `null` while starting, or when not started or closed.",
            "example": "2026-01-15 10:30:00"
          }
        },
        "required": [
          "id",
          "envName",
          "cloudBrowserStatus"
        ]
      },
      "CloudBrowserPageData": {
        "type": "object",
        "properties": {
          "total": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Total number of records.",
            "example": "42"
          },
          "current": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Current page number.",
            "example": "1"
          },
          "pages": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Total number of pages.",
            "example": "5"
          },
          "dataList": {
            "type": "array",
            "description": "Environments on the current page. Empty array when there are no results.",
            "items": {
              "$ref": "#/components/schemas/CloudBrowserPageItem"
            }
          }
        },
        "required": [
          "total",
          "current",
          "pages",
          "dataList"
        ]
      },
      "CloudBrowserConnectRequest": {
        "type": "object",
        "properties": {
          "envId": {
            "$ref": "#/components/schemas/EnvironmentId"
          }
        },
        "required": [
          "envId"
        ]
      },
      "CloudBrowserConnectResult": {
        "type": "object",
        "properties": {
          "cdpUrl": {
            "type": "string",
            "description": "Full CDP (Chrome DevTools Protocol) address including the access `token` parameter. Pass this\nURL to an automation framework such as Puppeteer, Playwright, or Selenium to attach to the\nremote browser.\n",
            "example": "https://runtime1.morelogin.com:16167?token=c62fedaaac524e41a0f02fc4345d41cb"
          },
          "accessUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Cloud browser page wrapper address. Open it in a browser to view and control the cloud\nbrowser desktop. `null` when the page wrapper is not configured.\n\nThe `token` parameter is a Base64-encoded payload carrying the desktop URL, desktop token,\nexpiry, and team, user, member, and environment IDs. The `envName` and `lang` parameters set\nthe displayed environment name and interface language.\n",
            "example": "https://official-website.morelogin.com/browser-remote?token=eyJkZXNrdG9wVXJsIjoi...ZW52SWQiOiIyMDczMzk1NDg5NzM4OTE5OTM2In0%3D&envName=P-1267&lang=en-US"
          }
        },
        "required": [
          "cdpUrl"
        ]
      }
    },
    "responses": {
      "VoidDataResponse": {
        "description": "Success",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "null",
                      "example": null
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "CloudBrowserPageResponse": {
        "description": "Success",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CloudBrowserPageData"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            }
          }
        }
      },
      "CloudBrowserConnectResponse": {
        "description": "Success",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CloudBrowserConnectResult"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": {
                "cdpUrl": "https://runtime1.morelogin.com:16167?token=c62fedaaac524e41a0f02fc4345d41cb",
                "accessUrl": "https://official-website.morelogin.com/browser-remote?token=eyJkZXNrdG9wVXJsIjoi...ZW52SWQiOiIyMDczMzk1NDg5NzM4OTE5OTM2In0%3D&envName=P-1267&lang=en-US"
              },
              "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
            }
          }
        }
      }
    }
  }
}